领扣(LeetCode)寻找峰值 个人题解
峰值元素是指其值大于左右相邻值的元素。
给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。
数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。
你可以假设 nums[-1] = nums[n] = -∞。
示例 1:
输入: nums =[1,2,3,1]
输出: 2
解释: 3 是峰值元素,你的函数应该返回其索引 2。
示例 2:
输入: nums =[1,2,1,3,5,6,4]
输出: 1 或 5
解释: 你的函数可以返回索引 1,其峰值元素为 2;
或者返回索引 5, 其峰值元素为 6。
说明:
你的解法应该是 O(logN) 时间复杂度的。
拿到这题,看了下评论,有直接使用函数取得数组内任意一个最大值,直接完成题目。虽然完成题目,但是与要求的做法不相符,并且不是O(logN)的复杂度。
于是考虑使用二分法,经典的O(logN)算法。找到中间的数,和左右两边对比,如果是最大的,直接输出。
但是这一题挖的一个小坑会坑到初学者和不严谨的人(比如我),就是他会有int类型的最小值的判例,如果你假设的num[-1]和num[n]是手动输入的某个看起来很大的负值,会导致错误。建议使用编程语言自带的int类型最小值属性。
代码如下:
 class Solution {
     public int findPeakElement(int[] nums) {
         int ans = 0;
         int begin = 0;
         int end = nums.length-1;
         int mid=0;
         while(begin<=end)
         {
             int leftnum,rightnum;
             mid=(begin+end)/2;
             leftnum=(mid==0?Integer.MIN_VALUE:nums[mid-1]);
             rightnum=(mid==nums.length-1?Integer.MIN_VALUE:nums[mid+1]);
             if(nums[mid]>leftnum&&nums[mid]>rightnum)
             {
                 return mid;
             }
             else if(leftnum>rightnum)
                 end=mid-1;
             else {
                 begin=mid+1;
             }
         }
         return ans;
     }
 }
领扣(LeetCode)寻找峰值 个人题解的更多相关文章
- leetCode(寻找峰值)-二分查找
		题目: 峰值元素是指其值大于左右相邻值的元素. 给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引. 数组可能包含多个峰值,在这种情况下,返回任何一个峰 ... 
- 领扣[LeetCode]从零开始[使用C++][1,10]
		0.序 以后不做后端开发是不是就用不到C++了?真香.话不多说,我已经躺倒在第一题上了.不贴题目了,持续更新. 1.两数之和 原文:https://www.cnblogs.com/grandyang/ ... 
- 领扣(LeetCode)删除链表中的节点 个人题解
		请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 现有一个链表 -- head = [4,5,1,9],它可以表示为: 4 -> 5 -> 1 - ... 
- 领扣(LeetCode)第三大的数  个人题解
		给定一个非空数组,返回此数组中第三大的数.如果不存在,则返回数组中最大的数.要求算法时间复杂度必须是O(n). 示例 1: 输入: [3, 2, 1] 输出: 1 解释: 第三大的数是 1. 示例 2 ... 
- Leetcode之二分法专题-162. 寻找峰值(Find Peak Element)
		Leetcode之二分法专题-162. 寻找峰值(Find Peak Element) 峰值元素是指其值大于左右相邻值的元素. 给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1] ... 
- LeetCode 162. 寻找峰值(Find Peak Element) 29
		162. 寻找峰值 162. Find Peak Element 题目描述 峰值元素是指其值大于左右相邻值的元素. 给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元 ... 
- Java实现 LeetCode 162 寻找峰值
		162. 寻找峰值 峰值元素是指其值大于左右相邻值的元素. 给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引. 数组可能包含多个峰值,在这种情况下,返 ... 
- 领扣-5 最长回文子串 Longest Palindromic Substring MD
		Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ... 
- 领扣-1/167 两数之和 Two Sum MD
		Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ... 
随机推荐
- React Diff算法一览
			前言 diff算法一直是React系统最核心的部分,并且由于演化自传统diff,使得比较方式从O(n^3)降级到O(n),然后又改成了链表方式,可谓是变化万千. 传统Diff算法 传统diff算法需要 ... 
- std::unordered_map
			map与unordered_map的区别 1.map: map内部实现了一个红黑树,该结构具有自动排序的功能,因此map内部的所有元素都是有序的,红黑树的每一个节点都代表着map的一个元素, 因此,对 ... 
- Unity3D 通过JSON查询天气
			一.天气查询API 获取天气信息,首先要找到提供天气数据的接口,我使用的是高德地图免费为我们提供的,网址为 https://lbs.amap.com/api/webservice/guide/api/ ... 
- c++异常处理的方法
			c++异常处理 程序运行时常会碰到一些异常情况,例如:做除法的时候除数为 0:用户输入年龄时输入了一个负数:用 new 运算符动态分配空间时,空间不够导致无法分配:访问数组元素时,下标越界:打开文件读 ... 
- linux "No space left on device" 磁盘空间解决办法
			某年某月某日某时,某人在工作中设置crontab定时任务规则保存时,提示“No space left on device”,此时用df -h检查磁盘,发现还有剩余空间.请问是什么原因及如何排查?什么会 ... 
- MyBatis 示例-传递多个参数
			映射器的主要元素: 本章介绍 select 元素中传递多个参数的处理方式. 测试类:com.yjw.demo.MulParametersTest 使用 Map 传递参数(不建议使用) 使用 MyBat ... 
- 百万年薪python之路  --  socket()模块的用法
			socket()模块的用法: import socket socket.socket(socket_family,socket_type,protocal=0) socket_family 可以是 A ... 
- SpringCloud学习--Eureka 服务注册与发现
			目录 一:构建项目 二:服务注册与发现 为什么选择Eureka,请看上一篇博客 Eureka -- 浅谈Eureka 项目构建 IDEA 选择 New Project 选择 Spring Initia ... 
- Java基础系列1:Java面向对象
			该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 概述: Java是面 ... 
- Airy Memory 内存清理 + 注册码
			链接: https://pan.baidu.com/s/1ZGxDtJBMhrRtBISvL1Lv0w 提取码: ccjs 
