LeetCode 34. 在排序數組中查找元素的第一個和最後一個位置【二分查找】

題目描述

給定一個按照升序排列的整數數組 nums,和一個目標值 target。找出給定目標值在數組中的開始位置和結束位置。

你的算法時間複雜度必須是 O(log n) 級別。

如果數組中不存在目標值,返回 [-1, -1]。

示例 1:

輸入: nums = [5,7,7,8,8,10], target = 8
輸出: [3,4]
示例 2:

輸入: nums = [5,7,7,8,8,10], target = 6
輸出: [-1,-1]

解題思路

可以看作是自己實現 C++ 裏的 lower_bound 和 upper_bound 函數。

AC

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        if(nums.empty()) return vector<int>{-1,-1};
        int lower = lower_bound(nums,target);
        int upper = upper_bound(nums,target)-1;
        if(lower == nums.size() || nums[lower]!=target)
            return vector<int>{-1,-1};
        return vector<int>{lower,upper};
    }
    int lower_bound(vector<int> &nums, int target){
        int left=0,right=nums.size(),mid;
        while(left<right){
            mid = (left+right)/2;
            if(nums[mid] >= target) right=mid;
            else left=mid+1;
        }
        return left;
    }
    int upper_bound(vector<int> &nums, int target){
        int left=0,right=nums.size(),mid;
        while(left<right){
            mid = (left+right)/2;
            if(nums[mid] > target) right=mid;
            else left=mid+1;
        }
        return left;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章