二分查找有序数组中某个数的所在范围 Search for a Range

原创 2013年12月04日 20:38:52

题目源自于leetcode。二分查找题。

题目: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 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].

思路:有序数组,所以查找目标的数一定是连续的在某个范围上。我们是要通过二分查找找到这些相同的数的最左端的一个、和最右端的一个。不管是左端还是右端,指定合理的二分策略,一定都是可以找到的。

寻找目标数最左端的二分策略:

	//Find left
        high = n-1;
        low = 0;
        mid = (high+low)/2;//如果分段内有奇数个数,mid位于正中间;如果有偶数个数,mid位于左中间
        while(high > low)
        {
            if(A[mid] >= target) //找到目标数时优先向左二分
                high = mid;
            else
                low = mid + 1;
            mid = (high+low)/2;
        }

寻找目标数最右端的二分策略:

	//Find right
        high = n-1;
        low = 0;
        mid = (high+low+1)/2;  //如果分段内有奇数个数,mid位于正中间;如果有偶数个数,mid位于右中间    
        while(high > low)
        {
            if(A[mid] > target)
                high = mid -1;
            else //找到目标数时优先向右二分
                low = mid;
            mid = (high+low+1)/2;
        }

代码:

class Solution {
public:
    vector<int> searchRange(int A[], int n, int target) {
        vector<int> result;
        int high, low, mid;
		//Find left
        high = n-1;
        low = 0;
        mid = (high+low)/2;
        while(high > low)
        {
            if(A[mid] >= target)
                high = mid;
            else
                low = mid + 1;
            mid = (high+low)/2;
        }
		
        if(A[mid] != target)
        {
            result.push_back(-1);
            result.push_back(-1);
            return result;
        }
        result.push_back(mid);

		//Find right
        high = n-1;
        low = 0;
        mid = (high+low+1)/2;      
        while(high > low)
        {
            if(A[mid] > target)
                high = mid -1;
            else
                low = mid;
            mid = (high+low+1)/2;
        }

        result.push_back(mid);
        
        return result;
    }
};


版权声明: GNU General Public License. https://github.com/lucky521

相关文章推荐

二分查找各种情况大总结

二分查找多次刷题时遇到,虽然每次也能写对,但花了蛮多时间,没好好想过。而且网上的太多版本,并不是很简洁,而且边界条件变化情况太多,容易混淆,下面是自己对二分查找的一些思考和总结,尽量写得简单易懂。 ...

基于二分查找法的数值区间查找

本文给出基于二分查找法的区间查找的定义,并辅以C++源码,并介绍一下二分查找法的区间查找的应用。...

数组中部分有序数据查找某个数

今天一哥们去美团面试碰到个面试题目,来咨询我,题目大概思想是一个有序的数组,把前面有序的一部分放到数组后面,是整个数组变成部分有序,也就是先递增,中断,然后再递增: 具体如下:  本来是 2  5...

从数组中找出一对元素,其和是一个给定的目标数字。假设数组中只存在一个符合要求的数值对,返回这些数值的下标

【解题分析】对于数组中某个下标i,如何判断它是否属于符合条件的两个数字之一?最直观的就是再次扫描数字,判断target-array【i】是否存在于数组中。这样做时间复杂度O(n^2),效率不高,原因是...

有序数组的查找

有序数组的查找 题目描述 给定一个排好序的数组,查找某个数是否在这个数组中,请编程实现。 分析与解法 一看到数组本身已经有序,直观的反应可能是用二分查找算法,毕竟二分查找算...

从Instant-Run出发,谈谈Android上的热修复

AndroidStudio从2.0开始,加入了一个功能叫做InstantRun,顾名思义,这个功能的作用就是让开发者能够立即运行自己的程序。具体点说,就是我们不用再像以前那样每次修改完代码都要重新构建...

使用AudioTrack和AudioRecord录制和播放PCM wave文件

   http://blog.csdn.net/brooknew/article/details/8274594  Android.media package里包含声音录放的两个类AudioR...

[LeetCode-34] Search for a Range (寻找有序数组中关键值的索引范围)

系统输入参数必须要做判断 输入数组的长度和自己求解出来数组的长度不一致 int numslen= sizeof(nums)/sizeof(int); numsize !=numslen; /*这里特...

leetcode 34. Search for a Range-数组边界|二分查找

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

leetcode-二分查找:Search for a range

题目描述给定一个已经排序的整数数组,找出目标值在数组中的索引范围,算法要求的时间复杂度为O(log(n)),如果被查找的目标值不在数组内则返回[-1,-1]. 例如在数组[5,7,7,8,8,10]...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二分查找有序数组中某个数的所在范围 Search for a Range
举报原因:
原因补充:

(最多只允许输入30个字)