• Find First and Last Position of Element in Sorted Array


    题目链接

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

    注意点

    • nums可能为空
    • 时间复杂度为O(logn)

    解法

    解法一:最普通的二分搜索,先找到一个target,然后向两边拓展。

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

    解法二:解法一在最坏情况下时间复杂度是O(n),比如整个nums都是target。因此我们用两次二分搜索,第一次找到第一个等于target的数字,第二次找到最后一个等于target的数字。时间复杂度O(logn)

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

    小结

  • 相关阅读:
    UVA 11354
    HDU 4081 Qin Shi Huang's National Road System 最小/次小生成树的性质
    UVA 10269 Adventure of Super Mario floyd dp
    UVA 11280 Flying to Fredericton 最短路DP
    【专题】树状数组
    【专题】Subsequence
    共享python代码模块
    完全背包
    POJ 3253 Fence Repair
    POJ 3069 Saruman's Army
  • 原文地址:https://www.cnblogs.com/multhree/p/10397258.html
Copyright © 2020-2023  润新知