162尋找峯值

題目描述

峯值元素是指其值大於左右相鄰值的元素。

給定一個輸入數組 nums,其中 nums[i] ≠ nums[i+1],找到峯值元素並返回其索引。

數組可能包含多個峯值,在這種情況下,返回任何一個峯值所在位置即可。

你可以假設 nums[-1] = nums[n] = -∞。

說明:

你的解法應該是 O(logN) 時間複雜度的。

思路分析

  1. O(N)。遍歷所有元素,找到max或者找到大於前後元素的元素。
  2. O(N)。
    • 因爲 nums[-1] 爲負無窮,所以 nums[0] > nums[-1],如果 nums[0] < nums[1] 則 nums[0] 就是峯值。
    • 對索引1的元素而言,只用判斷後一個位置的元素。
    • 所以將程序化簡爲遍歷所有元素,找到 nums[i] < nums[i+1] 的元素。
  3. O(logN),看到這個就要用二分。
    • 套用模板,主要是在判斷語句該怎麼寫。
    • 根據上一個分析,我們將 i 和 i+1 作比較,這裏也是一樣。
    • 若 nums[i] > nums[i+1]則峯值在 i 之前;
    • 若 nums[i] < nums[i+1]則峯值在 i+1 之後。

代碼實現

    public static int findPeakElement(int[] nums) {
        if (nums == null || nums.length == 0) {
            return -1;
        }
        int left = 0, right = nums.length - 1;
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] < nums[mid + 1]) {
                left = mid + 1;
            } else {
                right = mid;
            }
        }
        return left;
    }

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