1. 力扣704. 二分查找
2.27. 移除元素
两端双指针,左指针是要移除的元素就用右指针指向的元素代替,然后再判断一次左指针当前元素
int removeElement(vector<int>& nums, int val) {
if(nums.size() == 0) return 0;
int left = 0;
int right = nums.size()-1;
while(left <= right)
{
if(nums[left] == val)
swap(nums[left--],nums[right--]);
left++;
}
return left;
}
977. 有序数组的平方
前后双指针,找大的放在结果数组的最后一个位置上
209. 长度最小的子数组
1.暴力解法:计算每个位置开始符合目标的数组长度,返回最小的
2.滑动窗口:暴力解法中要从每个位置开始计算子数组,用滑动窗口避免重复计算
for()循环控制窗口结束位置,用一个指针控制窗口开始的位置
窗口移动规则:窗口数组和>=target,收缩;每次for循环扩张
int minSubArrayLen(int target, vector<int>& nums) {
int begin = 0, end = 0;
int ans = nums.size() + 1 ; //先初始化一个不可能的结果 用来判断是否返回0
int sum = 0, length = 0;
for(end; end < nums.size(); end++){
sum += nums[end]; //窗口数组和 每次for循环end++扩张窗口
length++;
while(sum >= target){ //窗口数组和>=target 收缩窗口
sum -= nums[begin];
begin++;
ans = min(length , ans); //如果当前子数组长度更小,更新结果
length--;
}
}
return ans == nums.size()+1? 0:ans;
}