【LeetCode从零单刷】Find Peak Element
2015-10-14 20:53
483 查看
题目:
A peak element is an element that is greater than its neighbors.
Given an input array where
The array may contain multiple peaks, in that case return the index to any one of the peaks is fine.
You may imagine that
For example, in array
the index number 2.
Note:
Your solution should be in logarithmic complexity.
解答:
难度在于时间复杂度,需要是对数时间。又是搜索题,很自然会想到二分搜索。
我们来看中间位置发生的情况:
如果是1……2,3,2……9,那么很自然可以返回3所在的位置作为一个峰值点;
如果是1……2,3,4……9,那么可以肯定峰值点出现在后半部分:3,4……9中;
如果是1……4,3,2……9,那么可以肯定峰值点出现在前半部分:1……4,3中;
如果仅剩两个数,峰值点在更大的数的位置;如果仅剩一个数,就返回其位置
A peak element is an element that is greater than its neighbors.
Given an input array where
num[i] ≠ num[i+1], find a peak element and return its index.
The array may contain multiple peaks, in that case return the index to any one of the peaks is fine.
You may imagine that
num[-1] = num = -∞.
For example, in array
[1, 2, 3, 1], 3 is a peak element and your function should return
the index number 2.
Note:
Your solution should be in logarithmic complexity.
解答:
难度在于时间复杂度,需要是对数时间。又是搜索题,很自然会想到二分搜索。
我们来看中间位置发生的情况:
如果是1……2,3,2……9,那么很自然可以返回3所在的位置作为一个峰值点;
如果是1……2,3,4……9,那么可以肯定峰值点出现在后半部分:3,4……9中;
如果是1……4,3,2……9,那么可以肯定峰值点出现在前半部分:1……4,3中;
如果仅剩两个数,峰值点在更大的数的位置;如果仅剩一个数,就返回其位置
class Solution { public: int findPeakElement(vector<int>& nums) { int range = nums.size() - 1; if((range/2 - 1 >= 0) && (range/2 + 1 <= range)) { if((nums[range/2] > nums[range/2 - 1]) && (nums[range/2] > nums[range/2 + 1])) { return (range/2); } else if(nums[range/2] < nums[range/2 - 1]) { vector<int> tmp(nums.begin(), nums.begin() + range/2); return findPeakElement(tmp); } else if(nums[range/2] < nums[range/2 + 1]) { vector<int> tmp(nums.begin() + range/2, nums.end()); return (range/2 + findPeakElement(tmp)); // 注意基础位置的偏移量 } } else { if(range == 0) return 0; if(range == 1) { if(nums[0] > nums[1]) return 0; else return 1; } } } };
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性
- C++ Custom Control控件向父窗体发送对应的消息