二分查找
文档链接: 代码随想录
看到题目出现有序数组,无重复元素使用,时间复杂度O(logn),主要分为左闭右闭和左闭右开两种写法。需要注意边界条件,while循环中根据开闭区间,是否需要包含left和right,跳出循环的条件是否需要包括middle,重点就是这些循环不变量(left,right的开闭),以及跳出区间的条件(middle是否)
LeetCode 704.Binary Search
因为闭区间的边界,在上一次while循环中已经被判断,所以更新middle时候不需要保留,而开区间相反。同时跳出循环的条件,也会被开闭区间影响。
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var search = function (nums, target) {
//[left,right]
let left = 0
let right = nums.length - 1
while (left <= right) {
let middle = left + ((right - left) >> 1)
if (nums[middle] < target) {
left = middle + 1
} else if (nums[middle] > target) {
right = middle - 1
} else {
return middle
}
}
return -1
}
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var search = function (nums, target) {
//[left,right)
let left = 0
let right = nums.length
while (left < right) {
let middle = left + ((right - left) >> 1)
if (nums[middle] < target) {
left = middle + 1
} else if (nums[middle] > target) {
right = middle
} else {
return middle
}
}
return -1
}
双指针
文档链接:代码随想录
快慢指针,重点是慢指针更新的时机,以及跳出循环的条件
LeetCode 27.Remove Element
/**
* @param {number[]} nums
* @param {number} val
* @return {number}
*/
var removeElement = function (nums, val) {
let result = nums.length
let fast = 0
let slow = 0
while (fast != nums.length) {
if (nums[fast] == val) {
result--
} else {
nums[slow] = nums[fast]
slow++
}
fast++
}
return result
};