1二分查找
单调递增数列中没有重复的数字
public static int binarySearch(int[] nums, int tar) {
int low = 0;
int high = nums.length - 1;
int mid;
while (low <= high) {
mid = (low + high) / 2;
if (tar == nums[mid]) {
return mid;
} else if (tar < nums[mid]) {
high = mid - 1;
} else {
low = mid + 1;
}
}
return low;
}
2二分查找查找第一个等于target和最后一个等于target的位置
单调递增数列中有重复的数字
2.1
考虑 target 开始和结束位置,其实我们要找的就是数组中「第一个等于 target 的位置」(记为leftIdx)和「第一个大于target 的位置减1」(记为rightIdx)。
二分查找中,寻找leftIdx 即为在数组中寻找第一个大于等于target 的下标,寻找 rightIdx 即为在数组中寻找第一个大于 target 的下标,然后将下标减一。
int right = binarySearch(nums , target+1)-1;
链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/solution/zai-pai-xu-shu-zu-zhong-cha-zhao-yuan-su-de-di-3-4/
添加链接描述
public int[] searchRange(int[] nums, int target) {
int[] ans = {-1,-1};
int low = 0;
int high = nums.length - 1;
if (high < 0 ) {
return ans;
}
int mid;
int left = binarySearch(nums , target);
int right = binarySearch(nums , target+1);
if(left == nums.length || target!=nums[left]){
return ans;
}
return new int[]{left,right-1};
}
public static int binarySearch(int[] nums , int tar){
int low =0;
int high = nums.length-1;
int mid=0;
while(low<=high){
mid=(low+high)/2;
if(tar<=nums[mid]){
high = mid-1;
}else{
low=mid+1;
}
}
return low;
}
2.2
public int[] searchRange(int[] nums, int target) {
int[] ans = {-1,-1};
int low = 0;
int high = nums.length - 1;
if (high < 0 ) {
return ans;
}
int mid;
while (low<high){
mid = (low+high)/2;
if(target<=nums[mid]){
high = mid;
}else {
low =mid+1;
}
}
if(target == nums[low]){
ans[0]=low;
}
//low=0;
high = nums.length - 1;
while (low<high){
mid = low+(high-low+1)/2;
if(target>=nums[mid]){
low =mid;
}else {
high =mid-1;
}
}
if(target == nums[low]){
ans[1]=low;
}
return ans;
}