Leetcode---尋找峰值--遍歷和二分
阿新 • • 發佈:2018-12-09
尋找峰值
題目連結:尋找峰值
思路:
- 這道題的題目有點沒講明白,比如一個數組為{1,5,2,3,4}那麼這裡5是峰值,4屬於峰值嗎?
- 第一個解法就是直接遍歷,遍歷1——nums.length-2之間的數是否為峰值,沒有峰值則返回max{nums[0],nums[nums.length-1]},相當於利用峰值的定義
public int findPeakElement(int[] nums) {
int max_index = 0;
if(nums.length==1) {
return max_index;
}else if(nums. length==2){
return nums[0]>nums[1]?0:1;
}
int i=1;
for(;i<nums.length-1;i++) {
if(nums[i]>nums[i-1]&&nums[i]>nums[i+1]) {
return i;
}
}
return nums[0]>nums[nums.length-1]?0:nums.length-1;
- 這裡我提交答案發現,該題中類似於上面陣列的時候,4也屬於峰值,這時我們就可以利用二分法求解
- 求得陣列的mid下標,將該數與mid+1上的數比較,捨棄較小的一邊,直至找到最大值,返回其下標
- 這裡不適用遞迴,定義左右兩個指標,使用迴圈即可
public int findPeakElement(int[] nums) {
if(nums.length==1) {
return 0;
}
int left = 0,right = nums.length-1;
while(left<right) {
int mid = left+(right-left)/2;
if(nums[mid]>nums[mid+1]) {
right = mid;
}else {
left = mid+1;
}
}
return left;
}