概念
二分法主要是解决在一堆有序的元素中查找指定的元素的问题,各种元素的查找,只要有序就可以用二分查找来优化。
二分法是一种“切块”查找的算法,大致的流程如下:
在排名前100的选手中,找到第66位选手。
- 二分法把100个人分为50个一组的两组,66位选手在后一组
- 二分法再分2组分别为50-75位和75-100位,66位在前一组
- …依次类推每次都是在中间切成两块,在其中一块中继续进行切块,最终找到66位
模板
var arr=Array.from({length:100},(_, i)=>1+(i))
//快速创建一个自然数数组
function binarySearch(arr,num)
{
var left=0;
var right=arr.length-1;
while(left<=right)
{
var mid=Math.floor((left+right)/2);
if(num>arr[mid])
{
left=mid+1;
}else if(num<arr[mid]){
right=mid-1;
}else{
return mid;
}
}
return -1;
}
console.log(binarySearch(arr, 20));
console.log(arr)
刷题巩固
704.二分查找 链接:https://leetcode-cn.com/problems/binary-search
852.山脉数组的峰顶索引 链接:https://leetcode-cn.com/problems/first-bad-version
278.第一个错误的版本 链接:https://leetcode-cn.com/problems/first-bad-version
441.排列硬币 链接:https://leetcode-cn.com/problems/first-bad-version
1337.矩阵中战斗力最弱的K行 链接:https://leetcode-cn.com/problems/the-k-weakest-rows-in-a-matrix