704. 二分查找
题目链接:. - 力扣(LeetCode)
给定一个 n
个元素升序数组 nums
和一个目标值 target
,写一个函数搜索 nums
中的 target
,如果目标值存在返回下标,否则返回 -1
。
写二分法,区间的定义一般为两种,左闭右闭即[left, right],或者左闭右开即[left, right)。
[left, right]:
left == right是有意义的,while (left <= right) 要使用 <=
if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target
[left, right):
left == right是无意义的,while (left < right) 要使用 <
if (nums[middle] > target) right 要赋值为 middle ,在闭右开区间中下一个查询区间不会去比较
/**
* @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 middle = Math.floor((left+right) / 2)
//当目标值大于middle值时,更新左指针
if(target > nums[middle]){
left = middle+1
}
//当目标值小于middle值时,更新右指针
else if(target < nums[middle]){
right = middle - 1
}
//当目标值等于middle值时,返回middle
else{
return middle
}
}
//nums中没有找到target,返回-1
return -1
};
27. 移除元素
题目链接:. - 力扣(LeetCode)
双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
- 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
- 慢指针:指向更新 新数组下标的位置
/**
* @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]
slow++
}
}
return slow
};