LeetCode不定時刷題——Peak Finder

Peak Finder

問題

在一個數組中找一個peak,使之大於他的鄰居即可。可假設數組兩端爲負無窮。

具體描述

A peak element is an element that is greater than its neighbors.

Given an input array where num[i] ≠ num[i+1], find a peak element and return its index.

The array may contain multiple peaks, in that case return the index to any one of the peaks is fine.

You may imagine that num[-1] = num[n] = -∞.

For example, in array [1, 2, 3, 1], 3 is a peak element and your function should return the index number 2.

算法描述

  1. 因爲我們假設兩端爲負無窮,因此我們只要找到數組的第一個元素大於第二個或最後一個元素大於倒數第二個元素即可說明其爲peak。若還未找到即可使用for循環對數組進行遍歷,判斷某個元素是否大於其鄰居,找到即可return。複雜度爲O(n)
  2. 易證在任何序列我們都可以找到局部的peak,所以我們使用二分法尋找,判斷中間的元素是不是,如果不是,判斷中間的元素是否大於右邊的元素,大於就將序列變小爲左邊的序列,反之亦然。複雜度爲O(logn)

代碼

public static int traversal(int []numbers){
		if(numbers[0]>=numbers[1]){
			return numbers[0];
		}
		else if (numbers[numbers.length-1]>=numbers[numbers.length-2]){
			return numbers[numbers.length-1];
		}
		else{
		for(int i=1;i<numbers.length-1;i++){
			if(numbers[i-1]<=numbers[i]&&numbers[i+1]<=numbers[i]){
				return numbers[i];
			}
		}
		}
		return 0;
	}
public static int binarySearch(int []numbers){
		int low=0;
		int high=numbers.length-1;
		int mid=0;
		while(high>low){
			mid=(high+low)/2;
			if(numbers[mid]>=numbers[mid-1]&&numbers[mid]>=numbers[mid+1]){
				return numbers[mid];
			}
			else if(numbers[mid]>=numbers[mid+1]){
				high=mid;
			}
			else{
				low=mid+1;
			}
		}
		return low;
	}

進一步瞭解

問題詳細解答

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章