1. 程式人生 > >Leetcode---尋找峰值--遍歷和二分

Leetcode---尋找峰值--遍歷和二分

尋找峰值

題目連結:尋找峰值

思路:
  • 這道題的題目有點沒講明白,比如一個數組為{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; }