leetCode 34.Search for a Range (搜索范围) 解题思路和方法

原创 2015年07月09日 12:58:59

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


思路:此题在思考的时候走了些弯路,一心想着一个循环解决问题,但是写代码的时候总是不能很好的解出。最后突然想起来,完全可以先二分查找最低的位置,然后再查找最高位置即可,这样就很简单了。不过里面还是有一些细节需要注意。

具体代码如下:

public class Solution {
    public int[] searchRange(int[] nums, int target) {
        int[] ans  = new int[]{-1,-1};
        //排除特殊情况
        if(nums.length == 0 || nums[0] > target || nums[nums.length-1] < target)
            return ans;
        //首尾都相等
        if(nums[0]== target && nums[nums.length-1] == target){
        	ans[0] = 0;
        	ans[1] = nums.length - 1;
        	return ans;
        }
        //二分查找    
        int low = 0;
        int hight = nums.length - 1;
        int mid = 0;
        //先求符合要求的起始值
        while(low <= hight){
        	mid = (low + hight)/2;
        	if(nums[mid] > target){
        		hight = mid -1;
        	}else if(nums[mid] < target){
        		low = mid + 1;
        	}else{
        		hight = mid;
        	}//判断结束情况
        	if(mid > 0 && nums[mid] == target && nums[mid -1] < target){
        		break;
        	}else if(mid == 0 && nums[mid] == target){
        		break;
        	}
        }
        //是否需要赋值。如果最低位置不存在,那么最高位置也不存在
        if(nums[mid] == target){
            ans[0] = mid;
            //再求符合要求的最大位置
            low = mid;//起始值设为target的最低位置
            hight = nums.length - 1;
            while(low <= hight){
            	mid = (low + hight)/2;
            	if(mid < nums.length - 1 && nums[mid + 1] == target){
            		mid ++;//这里很关键,因为(low+hight)/2自动向下取整的,所以看情况+1或向上取整
            	}
            	//分情况更新位置
            	if(nums[mid] > target){
            		hight = mid -1;
            	}else if(nums[mid] < target){
            		low = mid + 1;
            	}else{
            		low = mid;
            	}
            	//判断最高位置
            	if(mid <nums.length-1 && nums[mid] == target && nums[mid +1] > target){
            		break;
            	}else if(mid == nums.length-1 && nums[mid] == target){
            		break;
            	}
            }
            ans[1] = mid;//最低位存在,最高位肯定也存在
        }
        return ans;
    }
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

leetcode解题思路

转载地址:http://blog.csdn.net/liuxialong/article/details/41941407 收录https://oj.leetcode.com/problem...
  • zr459927180
  • zr459927180
  • 2016年07月26日 09:37
  • 565

Leetcode解题思路总结(Easy)

近来走上了Leetcode刷题之路,不过刷题背后更重要的是思路,掌握了方法,举一反三融会贯通。故在此我总结每道题的解题思路,按照题目从简单到难的顺序来列举。 292 Nim Game,传说中的一行...
  • luoshengkim
  • luoshengkim
  • 2015年12月17日 17:12
  • 2945

leetcode解题总结(持续更新)

树型:DFS或BFS(不够+状态存储,缩短时间)(如数位DP,就是DFS+状态存储) 链表:多用two pointer 无序数组:hash映射(O(1),map,set等),并查集,字典树tire 有...
  • ChinaJane163
  • ChinaJane163
  • 2016年09月21日 20:53
  • 613

Decode Ways 把字符串解码成数字组合@LeetCode

做这道题还是有很多收获的: 1.为了避免麻烦,开数组时可以开大一些,如int[] ways = new int[len+10]; 2. 这道题实际上是和计算要几步走完台阶的那道题本质是一样的。同样要用...
  • hellobinfeng
  • hellobinfeng
  • 2013年11月24日 05:05
  • 2743

LeetCode-BFS(广度优先搜索)总结

适用场景 输入数据:没什么特征,不像深搜,需要有“递归”的性质。如果是树或者图,概率更大。 状态转换图:树或者图。 求解目标:求最短。 思考的步骤 1. 是求路径长度,还是路径本身(或动作序...
  • baidu_26836893
  • baidu_26836893
  • 2015年04月21日 11:50
  • 612

LeetCode Search for a Range搜索特定数值的范围 三种方法求解

在排序数组中搜索一个值有多少个,并返回其两边下标,没有找到就返回[-1,-1]。注意时间效率是O(logN)。这就肯定要用到二分法的思想了。 主要难度是处理好下标的走势。 有三种方法可以求解: ...
  • kenden23
  • kenden23
  • 2013年12月03日 08:22
  • 1179

C++学习:范围for(range for)语句

语法范围for(range for)语句遍历给定序列中的每个元素并对序列中的每个值执行某种操作,其语法形式是: for (declaration : expression) st...
  • chfe007
  • chfe007
  • 2015年03月03日 23:53
  • 2370

leetCode 39.Combination Sum(组合总和) 解题思路和方法

Combination Sum Given a set of candidate numbers (C) and a target number (T), find all unique com...
  • xygy8860
  • xygy8860
  • 2015年07月09日 22:33
  • 1159

LeetCode解题思路(1)

屌丝程序猿的LeetCode刷题记【第一季——第1~50题】: 1.写给自己看的,同时希望能给大家一点帮助。 2.自己做不出来的题目借鉴了各路大神的思路。 3.很多题目做法都比较屌丝,但思路比较...
  • GeminiTeng2
  • GeminiTeng2
  • 2013年11月01日 21:40
  • 394

广度优先、深度优先搜索算法——LeetCode

广度优先搜索(Breadth-first Search)、深度优先搜索(Depth-first Search)算法面试题——LeetCode...
  • sunxianghuang
  • sunxianghuang
  • 2016年08月26日 19:55
  • 2330
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:leetCode 34.Search for a Range (搜索范围) 解题思路和方法
举报原因:
原因补充:

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