在排序数组中查找元素的第一个和最后一个位置(即左边界和右边界)
//最后left和right肯定会聚集到target上。
@SuppressWarnings({"all"})
class Solution {
public int[] searchRange(int[] nums, int target) {
int jieshu[] = {-1,-1};
int left = 0;
int right = nums.length;
if(nums.length == 0){
return jieshu;
}
//情况一:target 在数组范围的右边或者左边,例如数组{3, 4, 5},target为2或者数组 {3, 4, 5},target为6,此时应该返回{-1, -1}
if(target <nums[0] || target>nums[nums.length-1] ){
return jieshu;
}
//先找左边界
while(left<right){
int mid = left+(right-left)/2;
if(nums[mid] == target){
right = mid;
}
if(nums[mid]>target){
right = mid;
}
if(nums[mid]<target){
left = mid+1;
}
}
//情况二:target 在数组范围中,且数组中不存在target,例如数组{3,6,7},target为5,此时应该返回{-1, -1}
int l = nums[left] == target ? left:-1;
left = 0;
right = nums.length;
//再找右边界
while(left<right){
int mid = left+(right-left)/2;
if(nums[mid] == target){
left = mid+1;
}
if(nums[mid]>target){
right = mid;
}
if(nums[mid]<target){
left = mid+1;
}
}
//情况二:target 在数组范围中,且数组中不存在target,例如数组{3,6,7},target为5,此时应该返回{-1, -1}
int r = nums[left-1] == target? (left-1):-1;
int a[] = {l,r};
return a;
}
}
题备注
:
情况一:target 在数组范围的右边或者左边,例如数组{3, 4, 5},target为2或者数组{3, 4, 5},target为6,此时应该返回{-1, -1}
情况二:target 在数组范围中,且数组中不存在target,例如数组{3,6,7},target为5,此时应该返回{-1, -1}
情况三:target 在数组范围中,且数组中存在target,例如数组{3,6,7},target为6,此时应该返回{1, 1}。
最后left和right肯定会聚集到target上。那我在数组中,没找到taregt,则赋给边界-1.找到了,则赋值左边界和有边界给他。
那怎么判断找没找到呢?哦!就看left/right 是否和 target相等。