/**
* 二分查找的前提是 数组是有序的!!!!!!
*
* @param nums
* @param target
* @return
*/
public int binarySearch(int[] nums, int target) {
// 最左边和最右边
int l = 0, r = nums.length - 1;
while (l <= r) {
int mid = l + r >>> 1;
if (target < nums[mid]) { // 目标值在左边
r = mid - 1;
} else if (nums[mid] < target) { // 目标值在右边
l = mid + 1;
} else {
return mid;
}
}
return -1;
}
public int binarySearch2(int[] nums, int target) {
// 最左边和数组长度
int l = 0, r = nums.length;
while (l < r) {
int mid = l + r >>> 1;
if (target < nums[mid]) { // 目标值在左边
r = mid;
} else if (nums[mid] < target) { // 目标值在右边
l = mid + 1;
} else {
return mid;
}
}
return -1;
}
/**
* LeftMost与RightMost的应用:
* 1、前任、后任
* 2、排名
*/
/**
* 1、找到,返回 最靠左的索引
* 2、找不到,返回 满足元素 >=target的最小下标
*/
public int binarySearchLeftMost(int[] nums, int target) {
int l = 0, r = nums.length - 1;
while (l <= r) {
int mid = l + r >>> 1;
if (target <= nums[mid]) { // 目标值在左边
r = mid - 1;
} else { // 目标值在右边
l = mid + 1;
}
}
// 返回值
return l;
}
/**
* 1、找到,返回 最靠右的索引
* 2、找不到,返回 满足元素 <=target的最大下标
*/
public int binarySearchRightMost(int[] nums, int target) {
int l = 0, r = nums.length - 1;
while (l <= r) {
int mid = l + r >>> 1;
if (nums[mid] <= target) { // 目标值在右边
l = mid + 1;
} else { // 目标值在左边
r = mid - 1;
}
}
// 返回值
return l - 1;
}
二分查找与LeftRightMost
最新推荐文章于 2024-07-25 21:13:04 发布