162. Find Peak Element
文章目錄
- 1 題目理解
- 2 線性掃描
- 3 遞歸二分查找
1 題目理解
輸入:int[] nums并且 nums[i]!=nums[i+1]
輸出:找到稱為峰值的那個(gè)數(shù)字,返回其下標(biāo)。
規(guī)則:峰值是指:nums[i-1]<nums[i] 并且 nums[i+1]<nums[i]。你可以認(rèn)為nums[-1] = nums[n] = -∞.只要返回其中的一個(gè)峰值下標(biāo)即可。
2 線性掃描
參考網(wǎng)址
我們可以利用nums[i-1]<nums[i],nums[i+1]<nums[i]找到峰值。當(dāng)我們遇到一個(gè)數(shù)字的時(shí)候只需要判斷nums[i]>nums[i+1]即可。 為什么是這樣,下面分三種情況描述。
情況1,所有數(shù)字以降序排列。在這種情況下第一個(gè)元素就是峰值。我們判斷nums[i]>nums[i+1],就得出結(jié)論。當(dāng)然這個(gè)時(shí)候我們不需要判斷nums[i-1]與nums[i]。
情況2:所有元素以上升序列排列。最后一個(gè)元素是峰值。在這種情況下我們會(huì)一直判斷nums[i]與nums[i+1]的關(guān)系,一直不符合nums[i]>nums[i+1],所以選擇最后一個(gè)元素為峰值。
情況3:峰值處于中間某處。當(dāng)遍歷上升部分的時(shí)候,與情況2相同,沒(méi)有元素滿足nums[i]>nums[i+1]。我們不需要比較nums[i]與上一個(gè)元素nums[i-1]的關(guān)系。當(dāng)達(dá)到峰值元素時(shí)候,nums[i]>nums[i+1]滿足條件,不需要判斷nums[i]與上一個(gè)元素nums[i-1]的關(guān)系。由于會(huì)遍歷到nums[i],就已經(jīng)證明了nums[i-1]<nums[i]。某則就判斷為峰值了。
3 遞歸二分查找
二分法用于有序數(shù)數(shù)中。我們可以將一個(gè)普通數(shù)組看做是升序降序交替的數(shù)組。結(jié)果只要返回其中一個(gè)峰值即可。利用這兩點(diǎn),我們可以使用二分。
如果當(dāng)前處理的元素處于下降子序列,那么峰值一定在這個(gè)值的左邊,也可能包含這個(gè)值。如果當(dāng)前處理的元素處于上升子序列,那么峰值一定在這個(gè)值的右邊。因?yàn)楸容^的是nums[i]和nums[i+1]的關(guān)系,所以在此情況下,峰值肯定不是當(dāng)前元素。
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和本題分析思路一樣。
總結(jié)
以上是生活随笔為你收集整理的162. Find Peak Element的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【翻译】Fast Patch-based
- 下一篇: eclipse字体大小怎么设置