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

十年热恋 提交于 2019-12-03 15:03:56

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]

我的解:

Runtime: 12 ms, faster than 32.21% of C++ online submissions for Find First and Last Position of Element in Sorted Array.
Memory Usage: 10.2 MB, less than 98.90% of C++ online submissions for Find First and Last Position of Element in Sorted Array.
class Solution {
public:
    // 递归进行,二分查找
    void binSearch(vector<int>& nums, int target, int begin, int end, int& index1, int& index2)
    {
        while (begin <= end)
        {
            int mid = begin + (end - begin) / 2;
            if (nums[mid] == target)
            {
                if (mid < index1)index1 = mid;
                if (mid > index2)index2 = mid;
                if (begin == end) return ;
                if (mid > 0 && nums[mid - 1] == target) binSearch(nums, target, begin, mid - 1, index1, index2);
                if (mid < end && nums[mid + 1] == target) binSearch(nums, target, mid + 1, end, index1, index2);
                return;
            }
            if (nums[mid] < target)
            {
                begin = mid + 1;
            }
            if (nums[mid] > target)
            {
                end = mid - 1;
            }
        }
    }
    vector<int> searchRange(vector<int>& nums, int target) {
        vector<int> res{ -1,-1 };
        if (nums.size() < 1)return res;
        int b = 0;
        int e = nums.size() - 1;
        int index1 = e + 1;
        int index2 = b - 1;
        binSearch(nums, target, b, e, index1, index2);
        if (index1 <= index2)
        {
            res[0] = index1;
            res[1] = index2;
        }
        return res;
    }
};

优秀解1:

Runtime: 8 ms, faster than 85.03% of C++ online submissions for Find First and Last Position of Element in Sorted Array.
Memory Usage: 10.1 MB, less than 100.00% of C++ online submissions for Find First and Last Position of Element in Sorted Array.
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
    int idx1 = lower_bound(nums, target);
    int idx2 = lower_bound(nums, target+1)-1;
    if (idx1 < nums.size() && nums[idx1] == target)
        return {idx1, idx2};
    else
        return {-1, -1};
}
// 利用二分查找的思想
int lower_bound(vector<int>& nums, int target) {
    int l = 0, r = nums.size()-1;
    while (l <= r) {
        int mid = (r-l)/2+l;
        if (nums[mid] < target)
            l = mid+1;
        else
            r = mid-1;
    }
    return l;
}
};

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!