二分法主要为头尾指针。
头为0
尾为数组长度-1
let left = 0
let right = nums.length-1
定义中间值:
let mid = left + Math.floor((right-left)/2)
对中间值与标签值进行比较,并不断缩小区间
if(nums[mid]>target){
right=mid -1
}
if(nums[mid]<target){
left = mid + 1
}
循环变量,注:因为是左闭右闭区间,所以右区间可以取到值,左区间就也可以取到合法值
while(left<=right)
完整代码
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var search = function(nums, target) {
let left =0
let right = nums.length -1
while(left<=right){
let mid=left+Math.floor((right-left)/2)
if(nums[mid]>target){
right=mid -1
}
if(nums[mid]<target){
left = mid + 1
}
if(nums[mid]===target){
return mid
}
}
return -1
};
快慢指针
头尾双指针主要用在查询,快慢指针主要用在原地操作数组,起到用一个指针换一个新数组空间的作用。
主要思路:定义一个慢指针为0,快指针用于循环遍历,当快指针指向等于target时,将此时的值赋给慢指针,并将慢指针向后移动一位。最后慢指针的位置就是新数组有效值的最后一位
完整代码:
/**
* @param {number[]} nums
* @param {number} val
* @return {number}
*/
var removeElement = function(nums, val) {
let slow = 0
for(let fast = 0;fast<nums.length;fast++){
if(nums[fast]!==val){
nums[slow++]=nums[fast]
}
}
return slow
};