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 34 Search for a Range(搜索范围)

翻译给定一个整型已排序数组,找到一个给定值在其中的起点与终点。你的算法复杂度必须低于O(logn)。如果目标在数组中不会被发现,返回[-1, -1]。例如,给定[5, 7, 7, 8, 8, 10],...
  • NoMasp
  • NoMasp
  • 2015-11-28 21:08
  • 1764

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

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

[Leetcode] 34. Search for a Range 解题报告

题目: Given a sorted array of integers, find the starting and ending position of a given target valu...

leetcode解题之34. Search for a Range java 版(数字在排序数组中出现的次数)

leetcode解题之34. Search for a Range java 版(数字在排序数组中出现的次数)

Leetcode 34 Search for a Range (二分搜索 lower_bound和upper_bound)

Leetcode 34 Search for a Range (二分)

【LeetCode-面试算法经典-Java实现】【034-Search for a Range(搜索一个范围)】

【034-Search for a Range(搜索一个范围)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】原题  Given a sorted array of intege...

leetcode(34). Search for a Range

problem Given an array of integers sorted in ascending order, find the starting and ending posi...

LeetCode OJ-34.Search for a Range

LeetCode OJ-34.Search for a Range题目描述 Given an array of integers sorted in ascending order, find t...

leetcode 34. Search for a Range

import java.util.Stack; //Given a sorted array of integers, find the starting and ending position o...

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

Given a sorted array of integers, find the starting and ending position of a given target value. Yo...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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