zoukankan      html  css  js  c++  java
  • 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;
        }
    };
    

    小结

  • 相关阅读:
    响应式设计
    Flex box 弹性盒子布局
    下拉菜单  -
    html使用技巧
    nth-of-type(n)
    Js中 关于top、clientTop、scrollTop、offsetTop
    仿iPhone滑屏操作
    网页超过一页 点击回到顶部
    linux svn使用
    Linux查看CPU和内存使用情况
  • 原文地址:https://www.cnblogs.com/multhree/p/10397258.html
Copyright © 2011-2022 走看看