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

分析:首先根据二分查找找到开始的下标 ,然后再循环判断结束的下标。如果二分查找没有找到目标元素,则设为[-1,-1].

第一次提交代码:

 public int[] searchRange(int[] nums, int target) {
    	int len = nums.length;
    	int result[] = new int[2];
    	
    	 if(len==0 || nums[0]>target || nums[len-1]<target){//判断目标是否在数组中
         	 result[0]=-1;
         	 result[1]=-1;
         }else{
    	
        	 int high = nums.length-1;
        	 int low = 0;
        	 int mid = 0;
        	 boolean flag = false;
        	 while(low<high){  //先用二分查找到一个符合的下标
        		 flag = true;
        		 mid=low + (high-low)/2;  
        		 if(nums[mid]<target){
        			 low = mid+1;
        		 }else {
        			 high = mid;
        		 }
        	 }
        	 System.out.println("low "+low);
        	 result[0]=low;
        	 int i=low;
        	 
        	 for(;i<nums.length && nums[i]==target  ;i++){
        	 	}
        	 
        	 if(low==i){
        		 result[0]=-1;
        		 result[1]=-1;
        	 }else{
        	 	
        		 result[1]=i-1;
        	 }
        
         }
    		return result;        
    }

整理之后再次提交:

public int[] searchRange2(int[] nums, int target) {
    		 int len = nums.length;
    		 int result[] = new int[2];
    	
        	 int high = nums.length-1;
        	 int low = 0;
        	 int mid = 0;
        	 boolean flag = false;
        	 while(low<high){  //先用二分查找到一个符合的下标
        		 flag = true;
        		 mid=low + (high-low)/2;  
        		 if(nums[mid]<target){
        			 low = mid+1;
        		 }else {
        			 high = mid;
        		 }
        	 }
        	 System.out.println("low "+low);
        	 
        	 if(low>len || nums[low]!=target){
        		 result[0]=-1;
        		 result[1]=-1;
        	 }
        	 else{
        		 result[0]=low;
        		 int i=low;
        		 for(;i<nums.length && nums[i]==target  ;i++){
        		 }
        		 result[1]=i-1;
        	 }
        
    		return result;        
    }

做这道题目发现,在提交之前要想清楚边界条件,脑子永远比蛮力重要多。

方法三:分别求出其出现的上界和下界。

public int[] searchRange3(int[] nums, int target) {
		int[] res = new int[2];
		res[0] = lowerbound(nums, target);
		res[1] = upperbound(nums, target);
		return res;

	}

	int lowerbound(int[] nums, int target) {// 找相等的下界

		int high = nums.length-1;
        int low = 0;
        int mid = 0;
        while(low<high){
        	mid=low + (high-low)/2;  
        	if(nums[mid]<target){
        		low = mid+1;
        	}else {
        		high = mid;
        	}
        }
        
		return nums[low] == target ? low : -1;  //这样就避免了溢出
	}

	int upperbound(int[] nums, int target) { // 找关键字在数组中出现的上界
		int high = nums.length - 1;
		int low = 0;
		int mid = 0;
		while (low < high) {
			mid = low + (high - low + 1) / 2;
			if (nums[mid] <= target) {
				low = mid;
			} else {
				high = mid - 1;
			}
		}
		 return nums[low] == target ? low : -1;    //这样就避免了溢出
	}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值