001 有序数组的平方
分析
原数组是以升序排列(单调性),考虑头尾两个指针,比较平方的大小,找出大的一个,放在新开数组的最后。
代码
vector<int> sortedSquares(vector<int>& nums) {
int cnt = nums.size();
vector<int> res(cnt,-1);
int i = 0,j = cnt - 1;
int index = cnt - 1;
while(i <= j) {
if(nums[i] * nums[i] < nums[j] * nums[j]) {
res[index--] = nums[j] * nums[j];
j--;
}
else {
res[index--] = nums[i] * nums[i];
i++;
}
}
return res;
}
002 移动零
分析
理解循环不变量
两个指针,slow和fast同时移动,fast遇到0,swap。slow指针的左侧数字都不为0,因为题目要求不改变非0数字的相对顺序,soslow指针相当于记录了fast指针遇到0时应该交换的数字的位置。
图示
转自remark
代码
int slow = 0,fast = 0;
while(fast < nums.size()) {
if(nums[fast] != 0) {
swap(nums[slow],nums[fast]);
slow++;
}
fast++;
003乘积<k的子数组
Replay
一刷代码
int res = 0;
for(int i = 0; i < nums.size(); i++) {
if(nums[i] < k) res++;
}
int i = 0;int curr = nums[0];
for(int j = 1; j < nums.size(); j++) {
curr = curr * nums[j];
if(curr >= k) {
curr = curr / nums[i++];
if(curr < k) res++;
}
else res++;
}
return res;
考虑有欠缺,因为右指针到最后时,即退出循环时,从 i 到 j之间的数没有进行判断。
这是一道很pure的滑动窗口的题目,连续子数组
分析
本题的关键点就是figure out 在一个连续的窗口内,如果从左到右的乘积 <k,那么,此窗口内任意连续的子数组的乘积都<k,