LeetCode 34. Search for a Range

Description

Given an array of integers 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].

For example,
Given [5, 7, 7, 8, 8, 10] and target value 8,
return [3, 4].

my program

(1)時間複雜度爲O(n)

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        int i = 0, j = nums.size() -1;
        vector<int> res;
        while (i < nums.size())
        {
            if (nums[i] == target)  
                break;
            i++;
        }
        while ( j>= 0)
        {
            if (nums[j] == target)  
                break;
            j--;
        }
        if (i>=nums.size())
        {
            res.push_back(-1);
            res.push_back(-1);
        }else
        {
            res.push_back(i);
            res.push_back(j);
        }
        return res;
    }
};

(2)時間複雜度爲O(logn),利用二分查找

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

先找左邊界。當mid >= target,將end移動到mid,否則(mid < target),begin = mid+1;

再找右邊界。 當mid > target,將end移動到mid,否則(mid <= target),begin = mid+1;最後begin和end可能在target的左面一個。

如果沒有數組中target的話,那麼left和right會指到同一個值上,否則的話就意味着出現了target,此時left指向第一個出現的target,而right是指向最後一個target的下一個值,所以right需要減去1.

發佈了37 篇原創文章 · 獲贊 48 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章