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

    问题叙述性说明:

    Given a sorted array of integers, find the starting and ending position of a given target value.

    Your algorithm's runtime complexity must be in the order ofO(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,能够在O(lgn)时间完毕。

    假设数组中有target,当发现target后,对前后的内容继续用二分法 查找这种位置pos 。

    1. 前面的pos须要满足 A[pos] < target && A[pos+1] == target. pos+1即是開始位置。
    2. 后面的pos须要满足 A[pos] > target && A[pos-1] == target . pos-1是结束位置。


    代码:

    vector<int> searchRange(int A[], int n, int target) {   //C++
            vector<int> result(2);
            
            int low = 0, high = n-1;
            int mid, begin = -1, end = -1;
            while(low <= high)
            {
                mid = (low+high)/2;
                if(A[mid] > target)
                    high = mid - 1;
                else if(A[mid] < target)
                    low = mid + 1;
                else 
                {
                        begin = mid;
                        end = mid;
                        
                        //get begin
                        if(low <= begin -1){
                            while((low <= begin-1) && !(A[low]<target && A[low+1] == target) )
                            {
                                mid = (low + begin-1)/2;
                                if(A[mid] < target)
                                    low = mid+1;
                                else begin = mid;
                            }
                            if(A[low]<target && A[low+1] == target)
                                begin = low+1;
                        }
                        //get end
                        if(high >= end+1){
                            while((high >= end+1) &&!(A[high]>target && A[high-1] == target))
                            {
                                mid = (high + end +1)/2;
                                if(A[mid] > target)
                                    high = mid - 1;
                                else end = mid;
                            }
                            if(A[high]>target && A[high-1] == target)
                                end = high - 1;
                        }
                        break;
                        
                }
            }
            result[0] = begin;
            result[1] = end;
            return result;
        }


    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    在已安装的PHP版本之间切换
    LDAP系列(一)完整的 LDAP + phpLDAPadmin安装部署流程
    如何关闭Windows自动更新
    win10安装SDK、JAVA、Python配置环境变量
    怎么看懂接口文档
    全面解析 Postman 工具
    API接口监控
    jmeter面试题
    Navicat for MySQL 连接数据库
    Linux系统
  • 原文地址:https://www.cnblogs.com/yxwkf/p/4848858.html
Copyright © 2011-2022 走看看