1.二分查找 LeetCode704
这道题就是一道典型的二分查找,虽然看见题的第一眼还是想到了api大法。使用IndexOf就是这个功能,
当然还是要用二分法做这道题
二分查找的三个部分
-
预处理 —— 如果集合未排序,则进行排序。
-
二分查找 —— 使用循环或递归在每次比较后将查找空间划分为两半。
-
后处理 —— 在剩余空间中确定可行的候选者。
二分法自己最高不清的就是边界问题了,每次都不知道是left<right 还是left<=right
1.left<right,即不取right,right=length. 左闭右开
为了防止溢出:mid=left+(right-left)/2
取不到right,当优化左边界和右边界时,也取不到mid,所以优化左边界时right=mid,
右边界left=mid+1
2.left<=right,即能取到right,right=length-1 左闭右闭
可以取到right,当优化左边界和右边界时,也取不到mid,所以优化左边界时right=mid-1
右边界left=mid+1
找准一个方法就行
2.移除元素 LeetCode27
这道题之前刷过,但是当时应该不太理解,所以在刷就忘了
定义快慢指针,等于新建了一个数组。将符合数组的值放进去
快指针为值,慢指针为索引,符合的元素放进去之后,索引就要++。
慢指针的大小,就是新数组的大小
let slow=0
for(let fast=0;fast<nums.length;fast++){
if(nums[fast]!==val){
nums[slow]=nums[fast]
slow++
}
}
return slow
这样每次不需要被删除的值就被放在了新数组里面,而且没有改变元素的相对位置