二分查找思想
1.基本框架
function binarySearch(array,target) { let left = 0; ler right = ... while(...){ let mid = left + (right - left)/2; if(array[mid] == target) { ... } else if(array[mid] < target) { left = ... } else if(array[mid] > target) { right = ... } } return ...; }
2.寻找单个数的下标
function binarySearchSingle(array,target) { let left = 0; // 闭区间 let right = array.length - 1; // 闭区间 while(left <= right) { // 闭区间 let mid = left + parseInt((right - left)/2); if(array[mid] == target) { return mid; // 闭区间 } else if(array[mid] < target) { left = mid + 1; // 闭区间 } else if(array[mid] > target) { right = mid - 1; // 闭区间 } } return -1; }
3.寻找数出现的左区间边界
function binarySearchLeftZone(array,target){ let left = 0; // 闭区间 let right = array.length; // 开区间 while(left < right) { // 开区间 let mid = left + parseInt((right - left)/2); if(array[mid] == target) { // 这里的高妙之处是在寻找到值后,去掉右区间,不断寻找左区间的边界值。 right = mid; // 开区间 与上面的right一致 } else if(array[mid] < target) { left = mid + 1; // 闭区间 } else if(array[mid] > target) { right = mid; // 开区间 与上面的right一致 } } return array[left] == target ? left : -1; }
4.寻找数出现的右区间边界
function binarySearchRightZone(array,target){ let left = 0; // 闭区间 let right = array.length; // 开区间 while(left < right) { // 开区间 let mid = left + parseInt((right - left)/2); if(array[mid] == target) { // 这里的高妙之处是在寻找到值后,去掉左区间,不断寻找右区间的边界值。 left = mid + 1; // 闭区间 与上面的left一致 } else if(array[mid] < target) { left = mid + 1; // 开区间 } else if(array[mid] > target) { right = mid; // 开区间 } } return array[right-1] == target ? right-1 : -1; }
5.总结
写完二分的框架之后
确定左右边根据定义的left和right来确定闭区间跟开区间。
6.参考
https://www.cnblogs.com/kyoner/p/11080078.html

浙公网安备 33010602011771号