leetcode162, 寻找峰值

ifndef冬瓜 2018-09-04 03:02:31

int findPeakElement(vector<int>& nums) {
if(nums.size()==1||nums[0]>nums[1])
return 0;
int a = 0, b = nums.size()-1;
int mid = a + (b - a) / 2;
while(a < b)
{
if(nums[mid] > nums[mid-1] && nums[mid] > nums[mid+1])
return mid;
else if(nums[mid] < nums[mid-1])
b = mid;
else
a = mid+1;
mid = a + (b - a) / 2;
}
if(a == b && nums[a] > nums[a-1])
return a;
}

在leetcode代码界面执行时,输入测试用例为[-2,-1]时提示函数没有返回值???但是我放到其它ide上测试,结果就正常,不知道是什么问题??
...全文
259 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
NexTor 2018-09-06
  • 打赏
  • 举报
回复
你参考一下网上别人的解题方法吧,感觉你的思路有点想复杂了,简单的二分查找就好了。
public class Solution {
public int findPeakElement(int[] nums) {
int i=0, j=nums.length-1;
while (i<j) {
int m = (i+j)/2;
if (nums[m] > nums[m+1]) j=m; else i=m+1;
}
return i;
}
}
ifndef冬瓜 2018-09-06
  • 打赏
  • 举报
回复
引用 3 楼 NexTor 的回复:
你这代码逻辑有问题吧
如果[-2,-1]输入,a=0,b=1,mid=0
if(nums[mid] > nums[mid-1] && nums[mid] > nums[mid+1])这行代码中nums[mid] > nums[mid-1]会是nums[0]>nums[-1]的比较,数组越界了吧,而且你这代码在某些情况下确实也没有返回值。

不过除了这个越界的原因,会有哪种情况使他没有返回值呢、
ifndef冬瓜 2018-09-06
  • 打赏
  • 举报
回复
引用 3 楼 NexTor 的回复:
你这代码逻辑有问题吧
如果[-2,-1]输入,a=0,b=1,mid=0
if(nums[mid] > nums[mid-1] && nums[mid] > nums[mid+1])这行代码中nums[mid] > nums[mid-1]会是nums[0]>nums[-1]的比较,数组越界了吧,而且你这代码在某些情况下确实也没有返回值。

嗯,确实是越界了
NexTor 2018-09-05
  • 打赏
  • 举报
回复
你这代码逻辑有问题吧
如果[-2,-1]输入,a=0,b=1,mid=0
if(nums[mid] > nums[mid-1] && nums[mid] > nums[mid+1])这行代码中nums[mid] > nums[mid-1]会是nums[0]>nums[-1]的比较,数组越界了吧,而且你这代码在某些情况下确实也没有返回值。

ifndef冬瓜 2018-09-04
  • 打赏
  • 举报
回复
有没有人指点一下
ifndef冬瓜 2018-09-04
  • 打赏
  • 举报
回复
贴一下题目:
峰值元素是指其值大于左右相邻值的元素。

给定一个输入数组 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) 时间复杂度的。
1. 二分法 5 1.1. 什么是二分查找 5 1.2. 如何识别二分法 5 1.3. 二分法模板 6 1.3.1. 模板一 6 1.3.1.1. 模板代码 6 1.3.1.2. 关键属性 7 1.3.1.3. 语法说明 7 1.3.1.4. Lc69:x的平方根 8 1.3.1.5. Lc374:猜数大小 9 1.3.1.6. Lc33:搜索旋转数组 11 1.3.2. 模板二 13 1.3.2.1. 模板代码 13 1.3.2.2. 关键属性 14 1.3.2.3. 语法说明 14 1.3.2.4. Lc278:第一个错误版本 14 1.3.2.5. Lc162:寻找峰值 16 1.3.2.6. Lc153:寻找旋转排序数组最小值 19 1.3.2.7. Lc154:寻找旋转排序数组最小值II 20 1.3.3. 模板三 22 1.3.3.1. 模板代码 22 1.3.3.2. 关键属性 23 1.3.3.3. 语法说明 23 1.3.3.4. LC-34:在排序数组中查找元素的第一个和最后一个 23 1.3.3.5. LC-658:找到K个最接近的元素 25 1.3.4. 小结 28 1.4. LeetCode中二分查找题目 29 2. 双指针 30 2.1. 快慢指针 31 2.1.1. 什么是快慢指针 31 2.1.2. 快慢指针模板 31 2.1.3. 快慢指针相关题目 32 2.1.3.1. LC-141:链表是否有环 32 2.1.3.2. LC-142:环形链表入口 34 2.1.3.3. LC-876:链表的中间节点 37 2.1.3.4. LC-287:寻找重复数 40 2.2. 滑动窗口 43 2.2.1. 什么是滑动窗口 43 2.1.4. 常见题型 44 2.1.5. 注意事项 45 2.1.6. 滑动窗口模板 45 2.1.7. 滑动窗口相关题目 46 2.1.7.1. LC-3:无重复字符的最长子串 47 2.1.7.2. LC-76:最小覆盖子串 49 2.1.7.3. LC-209:长度最小的子数组 54 2.1.7.4. LC-239:滑动窗口最大值 57 2.1.7.5. LC-395:至少有K个重复字符的最长子串 60 2.1.7.6. LC-567:字符串排列 62 2.1.7.7. LC-904:水果成篮 64 2.1.7.8. LC-424:替换后的最长重复字符 66 2.1.7.9. LC-713:乘积小于K的子数组 67 2.1.7.10. LC-992:K个不同整数的子数组 70 2.3. 左右指针 73 2.3.1. 模板 73 2.3.2. 相关题目 73 2.3.2.1. LC-76:删除倒数第N个节点 74 2.3.2.2. LC-61:旋转链表 76 2.3.2.3. LC-80:删除有序数组中的重复项 79 2.3.2.4. LC-86:分割链表 80 2.3.2.5. LC-438:找到字符串中所有字母的异位词 82 3. 模板 85 2.3.2.6. LC-76:删除倒数第N个节点 85

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧