class Solution {public int[] searchRange(int[] nums, int target) {int i1=-1,i2=-1;// 先找最左边的int lo=0,hi=nums.length-1;while(lo<=hi){int mid=(lo+hi)/2;if(nums[mid]>target){hi=mid-1;}else if(nums[mid]<target){lo=mid+1;}else if(nums[mid]==target){if(mid==0||nums[mid]>nums[mid-1]){i1=mid;break;}else{// 还不是最左边的targethi=mid-1;}}}// 再找最右边的lo=0;hi=nums.length-1;while(lo<=hi){int mid=(lo+hi)/2;if(nums[mid]>target){hi=mid-1;}else if(nums[mid]<target){lo=mid+1;}else if(nums[mid]==target){if(mid==nums.length-1||nums[mid]<nums[mid+1]){i2=mid;break;}else{// 还不是最右边的targetlo=mid+1;}}}return new int[]{i1,i2};}
}
感觉我这个更容易理解:
其他的和搜索值一样,只是遇到相等的时候,比如要找左边界,那么左边界应该要么是第一个,要么是他左边的元素比他小
那么如果虽然相等,但是不满足上述条件,说明仍然要在该元素的左边搜索,hi=mid-1