目录
哇塞,第三道题卡住了,明明python能写粗来,C++就不行了,vector的是不说起来是不是要补充一下了
977. 有序数组的平方
很简单的双指针的做法,但是因为是倒序,所以我这里额外加了一个变量,从后面往前面赋值
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int> res(nums.size());
int start = 0;
int end = nums.size() - 1;
int index = end;
while (start <= end)
{
int s = nums[start] * nums[start];
int e = nums[end] * nums[end];
if (s > e){
res[index--] = s;
start++;
}
else{
res[index--] = e;
end--;
}
}
return res;
}
};
209. 长度最小的子数组
这个其实还记得写法, 可能是写过太多次了吧
这里比较重要的其实是滑动窗口的概念
所谓滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。
窗口就是 满足其和 ≥ s 的长度最小的 连续 子数组。
窗口的起始位置如何移动:如果当前窗口的值大于s了,窗口就要向前移动了(也就是该缩小了)。
窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int index = 0;
int cnt = nums.size();
int s_cnt = cnt - 1;
int sum = 0;
while (s_cnt>=0){ //这里可用for循环,计算总和,这里等于0是生效的,因为索引为0有值
sum += nums[s_cnt--];
}
if (sum < target) //如果总和都小于target,可以跳出去了
return 0;
sum = 0;
int res = cnt;
for(int i = 0; i < cnt; i++){
if (nums[i] >= target) //当前值大于target的话,直接返回1即可
return 1;
sum += nums[i];
while(sum >= target){
int tmp = i - index + 1;
res = res > tmp ? tmp : res;
sum -= nums[index++];
}
}
return res;
}
};
59. 螺旋矩阵 II
这个需要使用循环不变量,有一点我比较疑惑, 一样的思路,python可以,C++不行
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n, vector<int>(n, 0));
int cnt = 1;
int loop = n / 2;
int st_x = 0;
int st_y = 0;
int per_loop = n-1;
for(int i = 0; i < loop; i++){
for(int ia = 0; ia < per_loop; ia++){
res[st_x][st_y] = cnt++;
st_y++;
}
for(int ia = 0; ia < per_loop; ia++){
res[st_x][st_y] = cnt++;
st_x++;
}
for(int ia = 0; ia < per_loop; ia++){
res[st_x][st_y] = cnt++;
st_y--;
}
for(int ia = 0; ia < per_loop; ia++){
res[st_x][st_y] = cnt++;
st_x--;
}
st_x++;
st_y++;
per_loop -=2;
}
if (n % 2 == 1)
res[loop][loop] = cnt;
return res;
}
};