1. 程式人生 > 其它 >刷題-力扣-852

刷題-力扣-852

852. 山脈陣列的峰頂索引

題目連結

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/peak-index-in-a-mountain-array/
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

題目描述

符合下列屬性的陣列 arr 稱為 山脈陣列 :
arr.length >= 3
存在 i(0 < i < arr.length - 1)使得:
arr[0] < arr[1] < ... arr[i-1] < arr[i]
arr[i] > arr[i+1] > ... > arr[arr.length - 1]
給你由整陣列成的山脈陣列 arr ,返回任何滿足 arr[0] < arr[1] < ... arr[i - 1] < arr[i] > arr[i + 1] > ... > arr[arr.length - 1] 的下標 i 。

示例 1:

輸入:arr = [0,1,0]
輸出:1

示例 2:

輸入:arr = [0,2,1,0]
輸出:1

示例 3:

輸入:arr = [0,10,5,2]
輸出:1

示例 4:

輸入:arr = [3,4,5,1]
輸出:2

示例 5:

輸入:arr = [24,69,100,99,79,78,67,36,26,19]
輸出:2

提示:

  • 3 <= arr.length <= 104
  • 0 <= arr[i] <= 106
  • 題目資料保證 arr 是一個山脈陣列

進階:很容易想到時間複雜度 O(n) 的解決方案,你可以設計一個 O(log(n)) 的解決方案嗎?

題目分析

  1. 根據題目描述求山脈陣列的峰值索引
  2. 使用二分查詢

程式碼

class Solution {
public:
    int peakIndexInMountainArray(vector<int>& arr) {
        int left = 0;
        int right = arr.size() - 2;
        int mid = left + (right - left) / 2;
        while (left < right) {
            mid = left + (right - left) / 2;
            if (arr[mid] > arr[mid + 1]) right = mid;
            else left = mid + 1;
        }
        return left;
    }
};