1. 程式人生 > >leetcode題庫——在排序陣列中查詢元素的第一個和最後一個位置

leetcode題庫——在排序陣列中查詢元素的第一個和最後一個位置

題目描述:

給定一個按照升序排列的整數陣列 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]

方法:二分搜尋

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        vector<int> res;
        res.push_back(-1);
        res.push_back(-1);
        if(nums.size()==0) return res;
        if(nums.size()==1){
            if(nums[0]==target){
                res.clear();
                res.push_back(0);
                res.push_back(0);
                return res;
            }
        }
        int mid,low=0,high=nums.size()-1;
        int min=nums.size(),max=-1;
        
        while(low<=high){
            mid=(low+high)/2;
            if(nums[mid]<target) low=mid+1;
            if(nums[mid]>target) high=mid-1;
            if(nums[mid]==target){
                if(mid<min) min=mid;
                if(mid>max) max=mid;
                low++;
            }
        }

        low=0,high=nums.size()-1;
        while(low<=high){
            mid=(low+high)/2;
            if(nums[mid]<target) low=mid+1;
            if(nums[mid]>target) high=mid-1;
            if(nums[mid]==target){
                if(mid<min) min=mid;
                if(mid>max) max=mid;
                high--;
            }
        }
        
        if(nums[mid]!=target) return res;
        res.clear();
        res.push_back(min);
        res.push_back(max);
        return res;
    }
};

思路: 

文章中要求複雜度log(n),所以還是用二分法。

這個題要搜尋的數字與常規二分不一樣的是,這裡的數字可能會有重複,所以只要將常規二分搜尋的截止條件nums[mid]==target;break; 換掉就可以了。

因為符合條件的數字可能不止一個,但它們肯定分佈在搜尋到的位置的兩邊,所以在找到目標值所在的位置後,還要繼續進行搜尋,不可以break。因為可能分佈在兩邊,所有可以將low++,或者high--,二者都要進行,這樣才能找全。