二分法的左右边界
二分法用起来还是挺好用的,就是每次我总是纠结边界条件到底如何确定,用小于号还是小于等于号,满足条件后left是mid还是mid+1,为此专门做了两道简单题,整理了下思路。
题目一
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法
var searchInsert = function(nums, target) {
let left = 0
let right = nums.length
if(nums[0] > target) { return 0}
while(left < right){
?let mid = Math.floor(left + (right - left)/2)
?if(nums[mid] < target){
?left = mid + 1
?}else if(nums[mid] > target){
?right = mid
?}else {
?return mid
?}
}
return left
};
题目二
【二分法的左右边界】给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
var search = function(nums, target) {
let left = 0
let right = nums.length
while(left < right){
?let mid = Math.floor(left + (right - left)/2)
?if(nums[mid] < target){
?left = mid + 1
?}else if(nums[mid] > target){
?right = mid
?}else{
?return mid
?}
}
return -1
};
我一般做二分法的题都是使用小于号来做判断
while(left
当满足条件需要返回结果的时候,我们需要结合题意来指定输出。
特别值得注意的是mid的取值用的是Math.floor()方法这同样是因为我们想要的值是一个比mid大的一个整数(所以先向下取整,后面left取mid+1),避免区间重叠陷入死循环。
推荐阅读
- JS|深拷贝浅拷贝的区别(如何实现一个深拷贝?)
- JS|说说JavaScript中的数据类型
- 常见正则应用
- JavaScript|JavaScript 匿名函数、模块模式、闭包、命名空间、创建构造器(类)、继承
- Javascript自执行匿名函数(function() { })()的原理浅析
- JavaScript|函数有参无参真有很大区别吗()
- Web前端|轻松理解JavaScript匿名函数、自执行函数、闭包函数、回调函数
- JavaScript|JavaScript之匿名函数和闭包
- JavaScript|JavaScript常见数组方法,教你如何转置矩阵