zoukankan      html  css  js  c++  java
  • 61 搜索区间

    原题网址:https://www.lintcode.com/problem/search-for-a-range/description

    描述

    给定一个包含 n 个整数的排序数组,找出给定目标值 target 的起始和结束位置。

    如果目标值不在数组中,则返回[-1, -1]

    您在真实的面试中是否遇到过这个题?  

    样例

    给出[5, 7, 7, 8, 8, 10]和目标值target=8,

    返回[3, 4]

    挑战

    时间复杂度 O(log n)

    标签
    二分法
    数组
    排序数组
     
    思路:二分查找,找到后用两根指针分别向前移动找到起始位置、向后移动找到结束位置。注意边界元素。
    初始代码没有考虑空集或者没找到的情况囧……考虑问题还是要全面,不能因为做过类似的题就大意。
    start、end初值设为-2是为了判断是否在数组中找到target,初值不为-1是因为找到后若起始位置为0 start会变成-1,但end不会,所以如果判断条件是 start==-1&&end==-1 初值也可以都是-1……
     
    AC代码:
    class Solution {
    public:
        /**
         * @param A: an integer sorted array
         * @param target: an integer to be inserted
         * @return: a list of length 2, [index1, index2]
         */
        vector<int> searchRange(vector<int> &A, int target) {
            // write your code here
            int size=A.size();
        int left=0,right=size-1,middle=(left+right)/2;
        int start=-2,end=-2;
        vector<int> result(2,-1);
        //二分查找;
        while(left<=right)
        {
            if (A[middle]==target)
            {
                start=middle;
                end=middle;
                while(start>=0&&A[start]==target)
                {
                    start--;
                }
                while(end<=size-1&&A[end]==target)
                {
                    end++;
                }
                break;
            }
            else if (A[middle]<target)
            {
                left=middle+1;
                middle=(left+right)/2;
            }
            else
            {
                right=middle-1;
                middle=(left+right)/2;
            }
        }
        if (start==-2&&end==-2)//没找到;
        {
            return result;
        }
        start+=1;
        end-=1;
        result[0]=start;
        result[1]=end;
        return result;
        }
    };


    还可以使用库函数 lower_bound和upper_bound,参考:https://blog.csdn.net/wangyuquanliuli/article/details/46642637

    C++中lower_bound函数和upper_bound函数

     

  • 相关阅读:
    【Rust】匹配绑定
    【Rust】iflet
    【Rust】结构体匹配
    【Rust】闭包
    【Rust】函数
    【Rust】方法
    【Rust】whilelet
    【Rust】匹配保护
    【Rust】闭包捕获变量
    优先队列 安静点
  • 原文地址:https://www.cnblogs.com/Tang-tangt/p/9122471.html
Copyright © 2011-2022 走看看