今天有点事情耽搁了,太晚了随便写点吧。
209.长度最小的子数组
这个题目我除了暴力遍历没有想到其他的方法,看完一遍视频以后尝试着复现一下,一遍过。从我的角度来理解,这道题目的滑动窗口就像是一条蚯蚓,先不断移动区间的末端节点(可以理解为一条蚯蚓的尾巴不动,头向前伸),直到区间内的和大于等于指定值(蚯蚓躯体长度达到要求),然后再删减区间首端的值(蚯蚓的尾巴开始向前挪动),直到区间内的和不再大于等于指定值(蚯蚓又具备了向前爬的条件),区间的末端节点继续往前移动(蚯蚓的头继续向前伸,开始了下一次的蠕动),当末端节点碰到数组的末端时(蚯蚓碰壁了,不能再向前爬了),循环结束。在这个循环的过程中(蚯蚓向前爬动的过程中),我们要做的就是不断更新区间长度的最小值(蚯蚓能够再次向前爬的临界条件)
这是我的代码,仅供参考
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int i, j; //i为起始下标,j为终止下标
int sum = 0;
int len = nums.size() + 1;
for(i = 0, j = 0; j < nums.size(); j++){
sum += nums[j];
while(sum >= target){
len = min(len, j - i + 1);
sum -= nums[i];
i++;
}
}
if(len < nums.size() + 1)
return len;
return 0;
}
};
59.螺旋矩阵II
这个自己探索了一下,但是还是没有写出来,于是放弃,看视频理解然后自己敲,通过。
这类题目确实是第一次做,没有啥思路,看完讲解以后我觉得这道题目有几个关键点:
1.每转完一圈,可供填值的空白区域在行和列上均减少2行
这个规律解释了为什么旋转的圈数是n / 2,感觉这个有点像图像矩阵经过一个3*3卷积核后一样,有异曲同工之妙。
2.处理每一条边的规则必须一致
每一条边只负责处理该条边包含的结点,其他的不要碰(不要多管闲事),否则会出现逻辑混乱。这也是控制边界条件的关键,我就是在处理边界条件的时候被弄晕了。
3.每转完一圈,新一圈的起点应该在上一圈的起点的基础上向右下方移动一次
这就意味着需要用变量对每一圈的起点坐标进行记录,每转完一圈应该及时更新。
综上,根据老师的思想,我复现的代码如下,仅供参考。
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> result(n, vector<int>(n, 0));
int startx = 0;
int starty = 0;
int offset = 1;
int count = 1;
int k = 0; //控制圈数的变量
while(k < n / 2){ //旋转n/2圈
int i, j;
//新一轮转圈的起点
i = startx;
j = starty;
for( ; j < n - offset; j++){
result[i][j] = count;
count++;
}
for( ; i < n - offset; i++){
result[i][j] = count;
count++;
}
for( ; j > startx; j--){
result[i][j] = count;
count++;
}
for( ; i > starty; i--){
result[i][j] = count;
count++;
}
k++;
startx++;
starty++;
offset += 1;
}
if(n % 2 == 1)
result[startx][starty] = count;
return result;
}
};
拓展题没看,没时间看,下次有空的时候再说吧。