二分查找
双指针
题目:给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。(元素的顺序可以改变。这个很重要)
左右指针,右指针一直停留在数组最后一个不等于val的位置,从left开始检查,如果left值等于val,那么左右指针值交换,同时right--,left++;此时还要再次判断right,确保right始终停留在不等于val的位置。核心代码:
while(right >= 0 && nums[right] == val) right--; //将right移到从右数第一个值不为val的位置
while(left <= right) {
if(nums[left] == val) { //left位置的元素需要移除
//将right位置的元素移到left(覆盖),right位置移除
nums[left] = nums[right];
right--;
}
left++;
while(right >= 0 && nums[right] == val) right--;
}
滑动窗口
题目:给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
定义窗口起始指针i和结束指针j,首先结束指针后移,将遍历到的元素加和到sum,判断sum是否大于等于s,如果满足条件,记录此时窗口长度:j - i + 1; 判断此窗口长度是否小于目前记录的最小窗口长度result,小于则更新result;窗口起始指针后移,直到遍历完数组。核心代码:
int result = Integer.MAX_VALUE; //这个result初始化也很重要
for (int right = 0; right < nums.length; right++) {
sum += nums[right];
while (sum >= s) {
result = Math.min(result, right - left + 1);
sum -= nums[left++];
}
}
return result == Integer.MAX_VALUE ? 0 : result;