【推荐:】
二分查找的迭代Iterative写法(2)重点掌握 [ left, right ) 半开半闭区间
迭代写法 < . 若没找到,就有 target < left = right.
public static int binarySearch2(int[] nums, int target){
int left = 0;
int right = nums.length; // [ left, right )
while (left < right){ // left = right 不执行
int mid = (right - left) / 2 + left;
if(nums[mid] < target){ // [ mid + 1, right )
left = mid+1 ;
} else if (nums[mid] > target ){ // [ left, mid )
right = mid; // 注意 right = mid
} else {
return mid;
}
}
if(nums[left]==target)return left;
return -1;
}
二分查找的迭代Iterative写法(1)掌握 [ left, right ] 闭区间
迭代写法 <= . 若没找到,就有 right < target < left (right + 1 = left)
java 二分法源代码采用的方法( Arrays.binarySearch() )
public static int binarySearch1(int[] nums, int target){
int left = 0;
int right = nums.length -1; // [ left, right ]
while (left <= right){ // left <= right
int mid = (right - left) / 2 + left;
if(nums[mid] > target){ // [ left, mid -1 ]
right = mid - 1;
} else if (nums[mid] < target ){ // [ mid + 1, right ]
left = mid +1;
} else {
return mid;
}
return -1;
}
Leecode 35. 二分法的模板。
public class Solution {
/**
* @param A an integer array sorted in ascending order
* @param target an integer
* @return an integer
*/
public int findPosition(int[] nums, int target) {
if (nums == null || nums.length == 0) {
return -1;
}
int start = 0, end = nums.length - 1;
while (start + 1 < end) { //这里最关键:保证进入while循环的必须是至少有三个数。
int mid = start + (end - start) / 2;
if (nums[mid] == target) {
return mid;
} else if (nums[mid] < target) { //这里保证的是返回第一个相同值。
start = mid;
} else {
end = mid;
}
}
if (nums[start] == target) {
return start;
}
if (nums[end] == target) {
return end;
}
return -1;
}
}
在有重复数据的情况下,上述模板返回的是第一个相同数的位置。
如要返回最后一个相同数位置,微调即可。
网友评论