二分查找前提:
- 目标函数的单调性(单调递增或者递减)==> 可能涉及到数组的排序
- 存在上下界
- 能够通过索引访问
二分查找代码模板
function binarySearch(nums, target){
let left = 0;
let right = nums.length-1;
while(left <= right){
// let midddle = left + ((right-left)>>1)
let middle = Math.floor((left+right)/2)
if(nums[middle] === target){
return middle;
}else if(nums[middle] > target){
right = middle-1;
}else if(nums[middle] < target){
left = middle+1;
}
}
return -1;
}
参考链接
- 二分查找代码模板
-
实战题目
x 的平方根(字节跳动、微软、亚马逊在半年内面试中考过)
function mySqry(x){
if(x<2){return x}
let left = 1, mid, right = Math.floor(x/2);
while(left <= right){
mid = Math.floor(left + (right-left)/2);
if(mid * mid === x){
return x;
}else if(mid * mid > x){
right = mid - 1;
}else{
left = mid + 1;
}
}
return right;
}
有效的完全平方数(亚马逊在半年内面试中考过)
课后作业
搜索旋转排序数组(Facebook、字节跳动、亚马逊在半年内面试常考)
- 搜索二维矩阵(亚马逊、微软、Facebook 在半年内面试中考过)
- 寻找旋转排序数组中的最小值(亚马逊、微软、字节跳动在半年内面试中考过)
- 使用二分查找,寻找一个半有序数组 [4, 5, 6, 7, 0, 1, 2] 中间无序的地方
说明:同学们可以将自己的思路、代码写在学习总结中
特别好用的二分查找法模板(第 2 版)
https://www.liwei.party/2019/06/17/leetcode-solution-new/search-insert-position/
本周作业
简单:
- 柠檬水找零(亚马逊在半年内面试中考过)
- 买卖股票的最佳时机 II (亚马逊、字节跳动、微软在半年内面试中考过)
- 分发饼干(亚马逊在半年内面试中考过)
- 模拟行走机器人
使用二分查找,寻找一个半有序数组 [4, 5, 6, 7, 0, 1, 2] 中间无序的地方
说明:同学们可以将自己的思路、代码写在第 4 周的学习总结中中等:
[ ] 单词接龙(亚马逊在半年内面试常考)
- 岛屿数量(近半年内,亚马逊在面试中考查此题达到 350 次)
- 扫雷游戏(亚马逊、Facebook 在半年内面试中考过)
- 跳跃游戏 (亚马逊、华为、Facebook 在半年内面试中考过)
- 搜索旋转排序数组(Facebook、字节跳动、亚马逊在半年内面试常考)
- 搜索二维矩阵(亚马逊、微软、Facebook 在半年内面试中考过)
[ ] 寻找旋转排序数组中的最小值(亚马逊、微软、字节跳动在半年内面试中考过)
困难
[ ] 单词接龙 II (微软、亚马逊、Facebook 在半年内面试中考过)
- 跳跃游戏 II (亚马逊、华为、字节跳动在半年内面试中考过)