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);
}
}
}