leetcode162——Find Peak Element

題目大意:在給出的數組中找出峯值的索引,假設nums[-1]=nums[n]=-∞,如果有多個返回任意一個即可,要求時間複雜度O(logn),。

分析:二分查找。時間複雜度O(logn)自然聯想二分查找。利用好題裏的-∞條件來不斷縮小搜索空間:拿到mid,判斷nums[mid]和右側數據的大小關係,如果降序,說明峯值在[left,mid];如果升序,說明峯值在[mid+1,right]。

代碼:

方法一:線性查找。

class Solution {
public:
    int findPeakElement(vector<int>& nums) {
        for (int i = 0;i < nums.size() - 1;i++) {
            if (nums[i] > nums[i + 1]) return i;
        }
        return nums.size() - 1;
    }
};

方法二:二分查找。

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

 

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