(Java)LeetCode-34. 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].


这次我初始的思路是用二分查找找到一个值,然后前后寻找到边界值,只不过这样不能保证LgN的时间复杂度。代码如下:

package datastru;

public class Solution {

    public int[] searchRange(int[] nums, int target) {
    	int left = -1;
    	int right = -1;
    	int mid = binarySearch(nums, target, 0, nums.length-1);
    	int[] result = {-1, -1};
    	if(mid == -1){
    		return result;
    	}
    	int temp = mid;
    	while(temp>=0 && nums[temp] == target){
    		temp--;
    	}
    	temp++;
    	left = temp;
    	temp = mid;
    	while(temp<nums.length && nums[temp] == target){
    		temp++;
    	}
    	temp--;
    	right = temp;
    	result[0] = left;
    	result[1] = right;
        return result;
    }

	private int binarySearch(int[] nums, int target, int left, int right) {
		// TODO Auto-generated method stub
		if(left == right){
			if(nums[left] == target){
				return left;
			}else{
				return -1;
			}
		}
		int mid = (left + right)/2;
		if(target < nums[mid]){
			return binarySearch(nums,target,left,mid);
		}else if(target == nums[mid]){
			return mid;
		}else{
			return binarySearch(nums,target,mid+1,right);
		}
	}
	
	public static void main(String[] args){
		Solution sol = new Solution();
		int[] nums = {1,3};
		int[] result = sol.searchRange(nums, 1);
		for(int i : result){
			System.out.println(i);
		}
	}
}


然后我想干脆都换成二分查找吧,每次都二分查找,知道找不到了,就找到边界了,这样就是LgN 的时间复杂度了,也Accept了~


package datastru;

public class Solution {

    public int[] searchRange(int[] nums, int target) {    	
    	int mid = binarySearch(nums, target, 0, nums.length-1);
    	int left = mid; 
    	int left_temp = binarySearch(nums, target, 0, mid-1);
    	while(left_temp != -1){
    		left = left_temp;
    		left_temp = binarySearch(nums, target, 0, left_temp-1);
    	}
    	int right = mid;
    	int right_temp = binarySearch(nums, target, mid+1, nums.length-1);
    	while(right_temp != -1){
    		right = right_temp;
    		right_temp = binarySearch(nums, target, right_temp+1, nums.length-1);
    	}
    	
    	int[] result = {left,right};   	
    	return result;   	
    }
	private int binarySearch(int[] nums, int target, int left, int right) {
		// TODO Auto-generated method stub
		if(left > right)
			return -1;
		if(left == right){
			if(nums[left] == target){
				return left;
			}else{
				return -1;
			}
		}
		int mid = (left + right)/2;
		if(target < nums[mid]){
			return binarySearch(nums,target,left,mid);
		}else if(target == nums[mid]){
			return mid;
		}else{
			return binarySearch(nums,target,mid+1,right);
		}
	}
	
	public static void main(String[] args){
		Solution sol = new Solution();
		int[] nums = {1};
		int[] result = sol.searchRange(nums, 0);
		for(int i : result){
			System.out.println(i);
		}
	}
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值