Search For A Range

60 篇文章 0 订阅
30 篇文章 0 订阅
public class Solution {
    public int[] searchRange(int[] A, int target) {
		// Start typing your Java solution below
		// DO NOT write main() function
		int[] res = {-1, -1};
		if(A.length == 0)
			return res;
		int begin = 0;
		int end = A.length - 1;
		while(begin < end){
			int mid = begin + (end - begin) / 2;
			if(A[mid] >= target)
				end = mid;
			else
				begin = mid + 1;
		}
		if(A[begin] != target)
			return res;
		else
			res[0] = begin;
		
		begin = 0;
		end = A.length - 1;
		while(begin < end){
			int mid = begin + (end - begin + 1) / 2;// pay attention to +1 here, eg. {0, 1, 2, 3}, +1 makes mid to 2, not 1.
			if(A[mid] <= target)
				begin = mid;
			else
				end = mid - 1;
		}
		if(A[end] != target)
			return res;
		else
			res[1] = end;
		
		return res;
	}
}


Recursive:

	public int[] searchRange(int A[], int n, int target) {
		// Start typing your JAVA solution below
		// DO NOT write int main() function
		int[] result = {-1, -1};
		result[0] = findPosition(A, 0, n - 1, target, true);
		result[1] = findPosition(A, 0, n - 1, target, false);
		return result;

	}

	int findPosition(int A[], int begin, int end, int target, boolean leftFlag) {
		if (begin > end)
			return -1;
		int middle = (begin + end) / 2;
		if (A[middle] == target) {
			int position;
			if (leftFlag) {
				position = findPosition(A, begin, middle - 1, target, leftFlag);
			} else {
				position = findPosition(A, middle + 1, end, target, leftFlag);
			}
			return (position == -1) ? middle : position;
		} else if (A[middle] < target) {
			return findPosition(A, middle + 1, end, target, leftFlag);
		} else {
			return findPosition(A, begin, middle - 1, target, leftFlag);
		}
	}

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


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值