1.二分算法
边界开闭 左闭右闭 原则
这里的,middle不是要找的值。那么nums【middle】>tager
我们要更新右边界为middle-1 (因为要左区间 所以更新右边界)
在这里插入图片描述
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0, right = nums.size() - 1;
while (left <= right) {
int mid = (right - left) / 2 + left;
int num = nums[mid];
if (num == target){
return mid;
}else if ( num>target )
right = mid -1;
else {
left =mid + 1;
}
}
return -1;
}
};
2.移除元素
双指针法
1.明确两指针代表什么意思
fast:新数组里所需要的元素
获取到新数组所需要的元素之后 赋值给新数组
slow:指向更新 新数组下标的位置
把新数组所需要的值赋值给新数组所在的位置
更新完之后 slow++ 到下一个(3)的位置
在这里插入图片描述
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int n = nums.size();
int slow = 0;
for(int fast =0;fast <n; fast++){
if (nums[fast] != val){
nums[slow] = nums[fast];
slow++;
}
}
return slow;
}
};
3.有序数组的平方
根据特性一定是取完平方后在两边取最大值
双指针由大到小从中间合拢得到一个数组
i < = j i=j包含中间的元素 否则缺少了一个元素
()最后不写 因为要看i++与j–那个位置上的元素更大 要不然无法判断先i++ 还是j—-
不能写在循环条件里的
209.长度最小的子数组
滑动窗口 利用一个for循环
循环里面代表的是滑动窗口的终止位置,还是起始位置
确定j代表终止位置,那么难点在于i起始位置怎么移动
当集合》=S 后 ,说明这个集合满足条件了,我们移动起始位置,开始缩小集合
用while来持续移动
59.螺旋矩阵