日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

162. Find Peak Element

發布時間:2023/12/10 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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]。某則就判斷為峰值了。

class Solution {public int findPeakElement(int[] nums) {for(int i=1;i<nums.length;i++){if(nums[i]<nums[i-1]){return i-1;}}return nums.length-1;} }

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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。