zoukankan      html  css  js  c++  java
  • Search for a Range

    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].

    本题 明显的是在字符串中进行二分查找 只是不是简单的查找到目标数字target 而是找到他的左右端点

    普通的二分查找中 在left right之间的mid处的数据与target做比较  小于则left右移 大于则right左移 直至等于找到或者left已经大于right未找到

    本题中 自然可以按照上述方法找到target的位置 但并不能找到其左右端点  但是不管是否等于target 而左右继续移动 left和right 就可以找到其左右端点处了

    1、二分查找中  mid处的数据<target left右移   其他情况 包括mid处数据=target right都左移  则最后的left即为左端点

    2、与1相对   mid处数据>target  right左移 其他都left右移 则最后的right即为右端点

    按照以上两步 即可以通过两次二分查找找到其左右端点 时间复杂度在O(lgn)里

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

    此外 也可以一次普通的二分查找找到目标数据的位置后  在其左二分查找到左端点 其右二分查找到其右端点

    这样的话总共三次二分查找  但是后两次的查找范围明显变小

  • 相关阅读:
    《JavaScript面向对象的编程指南》--读书笔记
    《高性能JavaScript》--读书笔记
    《高性能网站建设指南》--读书笔记
    vertical-align属性探究
    IP地址.md
    Visual Studio Code.md
    ComboBox
    2017 续办上海居住证和积分办理流程
    希腊字母、拉丁字母、Markdown、拼写与读音中英对照表
    Windows Server 2008 添加 IIS 服务
  • 原文地址:https://www.cnblogs.com/weiyi-mgh/p/6406625.html
Copyright © 2011-2022 走看看