34. Find First and Last Position of Element in Sorted Array

題目描述:

Given an array of integers nums sorted in ascending order, find the starting and ending position of a given target value.

Your algorithm's runtime complexity must be in the order of O(log n).

If the target is not found in the array, return [-1, -1].

Example 1:

Input: nums = [5,7,7,8,8,10], target = 8
Output: [3,4]

代碼:

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        vector<int> result;
        if(nums.size() == 0){
            result.push_back(-1);
            result.push_back(-1);
            return result;
        }
        int l = 0, r = nums.size() - 1;
        int left, right;
        while(l <= r){  //第一次二分,找小於target的第一個數
            int mid = (l + r) / 2;
            if(nums[mid] >= target) r = mid - 1;
            if(nums[mid] < target) l = mid + 1;
        }
        if(l < nums.size()) left = l;
        else left = r;
        if(nums[left] != target){
            result.push_back(-1);
            result.push_back(-1);
            return result;
        }
        
        l = 0;
        r = nums.size() - 1;
        while(l <= r){ //第二次二分,找大於target的第一個數
            int mid = (l + r) / 2;
            if(nums[mid] <= target) l = mid + 1;
            if(nums[mid] > target) r = mid - 1;
        }
        if(r >= 0) right = r;
        else right = 0;
        result.push_back(left);
        result.push_back(right);
        return result;
    }
};

題目要求找有序數組中target的上標的下標,並且要求時間複雜度爲O(log n)。早就想測試一下leetcode的評測系統會不會檢測代碼的時間複雜度,於是先隨手寫了一個for遍歷測試了一下(時間複雜度爲O(n))。果不其然,AC了,emmm......事實證明如果你只是單純地想AC題的話,這些時間複雜度什麼的要求直接可以忽略了,但是博主還是建議大家按照要求的時間複雜度做題,來鞏固自己的算法知識。

題目很簡單,就是一些邊界值在收到WA後才考慮清楚,其實我最開始的思路是進行一次二分查找,找到隨便一個target的位置,然後從該位置開始左右遍歷,尋找上標和下標,但是這樣做的話,最壞時間複雜度是當原字符串所有元素都是target的時候,程序時間複雜度爲O(n),所以這不符合題目要求。最後決定用兩次二分來完成,第一次二分找大於等於target的第一個數,第二次二分找小於等於target的第一個數。

靜心盡力!

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