162. Find Peak Element
文章目錄
- 1 題目理解
- 2 線性掃描
- 3 遞歸二分查找
1 題目理解
輸入:int[] nums并且 nums[i]!=nums[i+1]
輸出:找到稱為峰值的那個數字,返回其下標。
規則:峰值是指:nums[i-1]<nums[i] 并且 nums[i+1]<nums[i]。你可以認為nums[-1] = nums[n] = -∞.只要返回其中的一個峰值下標即可。
2 線性掃描
參考網址
我們可以利用nums[i-1]<nums[i],nums[i+1]<nums[i]找到峰值。當我們遇到一個數字的時候只需要判斷nums[i]>nums[i+1]即可。 為什么是這樣,下面分三種情況描述。
情況1,所有數字以降序排列。在這種情況下第一個元素就是峰值。我們判斷nums[i]>nums[i+1],就得出結論。當然這個時候我們不需要判斷nums[i-1]與nums[i]。
情況2:所有元素以上升序列排列。最后一個元素是峰值。在這種情況下我們會一直判斷nums[i]與nums[i+1]的關系,一直不符合nums[i]>nums[i+1],所以選擇最后一個元素為峰值。
情況3:峰值處于中間某處。當遍歷上升部分的時候,與情況2相同,沒有元素滿足nums[i]>nums[i+1]。我們不需要比較nums[i]與上一個元素nums[i-1]的關系。當達到峰值元素時候,nums[i]>nums[i+1]滿足條件,不需要判斷nums[i]與上一個元素nums[i-1]的關系。由于會遍歷到nums[i],就已經證明了nums[i-1]<nums[i]。某則就判斷為峰值了。
3 遞歸二分查找
二分法用于有序數數中。我們可以將一個普通數組看做是升序降序交替的數組。結果只要返回其中一個峰值即可。利用這兩點,我們可以使用二分。
如果當前處理的元素處于下降子序列,那么峰值一定在這個值的左邊,也可能包含這個值。如果當前處理的元素處于上升子序列,那么峰值一定在這個值的右邊。因為比較的是nums[i]和nums[i+1]的關系,所以在此情況下,峰值肯定不是當前元素。
class Solution {public int findPeakElement(int[] nums) {return findPeakElement(nums,0,nums.length-1);}private int findPeakElement(int[] nums,int l,int r){if(l==r) return l;int m = l +((r-l)>>1);if(nums[m]>nums[m+1]){return findPeakElement(nums,l,m);}else{return findPeakElement(nums,m+1,r);}} }leetcode 852和本題分析思路一樣。
總結
以上是生活随笔為你收集整理的162. Find Peak Element的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【翻译】Fast Patch-based
- 下一篇: 【Android Studio】分类整理