☆* o(≧▽≦)o *☆嗨~我是小奥🍹
📄📄📄个人博客:小奥的博客
📄📄📄优快云:个人优快云
📙📙📙Github:传送门
📅📅📅面经分享(牛客主页):传送门
🍹文章作者技术和水平有限,如果文中出现错误,希望大家多多指正!
📜 如果觉得内容还不错,欢迎点赞收藏关注哟! ❤️
二分查找
二分搜索的三种写法
// 左闭右闭区间,求 >=x 的第一个数
// >x 可以转换成 >= (x+1)
// <x 可以转换成 (>=x) -1
// <=x 可以转换成 (>x)-1,即 >=(x+1) - 1
int binarySearch(int[] nums, int target) {
int l = 0, r = nums.length - 1; // 左闭右闭区间 [0, r]
while(l <= r) {
int mid = l + (r - l) >> 1;
if(nums[mid] < target) {
l = mid + 1; //[mid + 1, right]
} else {
r = mid - 1; //[l, mid - 1]
}
}
return l; // l == r + 1
}
// 左闭右开区间
int binarySeach(int[] nums, int target) {
int l = 0, r = nums.length; // 左闭右开区间 [l, r)
while(l < r) {
int mid = l + (r - l) >> 1;
if(nums[mid] < target) {
l = mid + 1; // [mid + 1, r)
} else {
r = mid; // [l, mid)
}
}
return l; // l == r
}
// 左开右开区间
int binarySearch(int[] nums, int target) {
int l = -1, r = nums.length; // 开区间 (-1, r)
while(l + 1 < r) {
int mid = l + (r - l) >> 1;
if(nums[mid] < target) {
l = mid; // (mid, r)
} else {
r = mid; // (l, mid)
}
}
return r; // l + 1 = r
}
二分搜索,左边界和右边界
// 搜索左边界
int left_bound(int[] nums, int target) {
int left = 0, right = nums.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] < target) {
left = mid + 1;
} else if (nums[mid] > target) {
right = mid - 1;
} else if (nums[mid] == target) {
// 别返回,锁定左侧边界
right = mid - 1;
}
}
// 判断 target 是否存在于 nums 中
// 此时 target 比所有数都大,返回 -1
if (left == nums.length) return -1;
// 判断一下 nums[left] 是不是 target
return nums[left] == target ? left : -1;
}
// 搜索右边界
int right_bound(int[] nums, int target) {
int left = 0, right = nums.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] < target) {
left = mid + 1;
} else if (nums[mid] > target) {
right = mid - 1;
} else if (nums[mid] == target) {
// 别返回,锁定右侧边界
left = mid + 1;
}
}
// 此时 left - 1 索引越界
if (left - 1 < 0) return -1;
// 判断一下 nums[right] 是不是 target
return nums[right] == target ? right : -1;
}
练习题
二分答案
最小化最大值
🚀