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]

Example 2:

Input: nums = [5,7,7,8,8,10], target = 6
Output: [-1,-1]
// STL lower_bound and upper_bound Method
vector<int> searchRange(vector<int>& nums, int target) { // time: O(logn); space: O(1)
    vector<int> res(2, -1);
    if (nums.empty()) return res;
    auto start = lower_bound(nums.begin(), nums.end(), target);
    if (start == nums.end() || *start != target) return res;
    else res[0] = start - nums.begin();
    auto end = upper_bound(nums.begin(), nums.end(), target);
    res[1] = end - nums.begin() - 1;
    return res;
}
// Binary Search
vector<int> searchRange(vector<int>& nums, int target) { // time: O(logn); space: O(1)
    vector<int> res(2, -1);
    if (nums.empty()) return res;
    int n = nums.size(), left = 0, right = n - 1;
    // Find the first location
    while (left < right) {
        int mid = left + (right - left) / 2;
        if (nums[mid] < target) left = mid + 1;
        else right = mid;
    }
    if (nums[left] != target) return res;
    else res[0] = left;
    // reset right pointer
    right = n - 1;
    // Find the last location
    while (left < right) {
        int mid = left + (right - left) / 2 + 1; // bias to the right
        if (nums[mid] > target) right = mid - 1;
        else left = mid;
    }
    res[1] = right;
    return res;
}

兩個binary search就是分別在實現STL lower_bound和upper_bound,去分別找到不大於target的第一個位置,還有大於target的第一個位置。

// Binary Search
vector<int> searchRange(vector<int>& nums, int target) { // time: O(logn); space: O(1)
    vector<int> res(2, -1);
    if (nums.empty()) return res;
    int n = nums.size(), left = 0, right = n - 1;
    // Find the first location
    while (left < right) {
        int mid = left + (right - left) / 2;
        if (nums[mid] < target) left = mid + 1;
        else right = mid;
    }
    if (nums[left] != target) return res;
    else res[0] = left;
    // reset right pointer
    right = n;
    // Find the last location
    while (left < right) {
        int mid = left + (right - left) / 2;
        if (nums[mid] <= target) left = mid + 1;
        else right = mid;
    }
    res[1] = right - 1;
    return res;
}

Last updated

Was this helpful?