209.长度最小的子数组
这道题我想到是滑动窗口了,第一版没看视频写了如下代码,很遗憾超过时间。。。
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int len = nums.size();
int left = 0, right = 0;
int sum = 0, result = INT_MAX;
while(left <= right && right < len){
if(sum < target) {
right++;
sum+=nums[right];
}
else if(sum > target) {
left++;
sum -= nums[left];
}
else{
result = min(result,right - left + 1);
}
}
return result == INT_MAX? 0 : result;
}
};
问题分析(GPT牛逼)
-
数组访问越界:
- 在
sum += nums[right];
和sum -= nums[left];
中,没有确保right
和left
的合法性。如果right
或left
越界,会引发运行时错误。
- 在
-
边界条件不完整:
while(left <= right && right < len)
中,当left == right
且窗口内的和满足条件时,无法更新result
,从而导致可能漏掉正确结果。
-
逻辑错误:
- 在
else
中,result = min(result, right - left + 1);
后没有更新left
或right
的值,可能会陷入死循环。(第一个用例是卡在这了)
- 在
修改完后:
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int left = 0, right = 0;
int sum = 0, result = INT_MAX;
for(;right < nums.size(); ++right) {
sum+=nums[right];
while(sum >= target) {
result = min(result, right - left + 1);
sum-=nums[left++];
}
}
return result == INT_MAX? 0 : result;
}
};
59.螺旋矩阵II
自己有一些头绪,但是想不到是用这种模拟的方式思考。我自认想了很多边界,但是把数值N扩大发现又要处理很多边界条件,所以还是按照视频中提到的做法去做模拟。代码本身不难,难点是思考到这一步。
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> arr(n,vector<int>(n,0));
int startX = 0, startY = 0;
int loop = n / 2;
int count = 1;
int offset = 1;
while(loop--){
int i = startX, j = startY;
for(; j < n - offset;j++){
arr[i][j] = count++;
}
for(; i < n - offset;i++){
arr[i][j] = count++;
}
for(; j > startY;j--){
arr[i][j] = count++;
}
for(; i > startX;i--){
arr[i][j] = count++;
}
startX++;
startY++;
offset++;
}
if(n % 2) arr[n/2][n/2] = n * n;
return arr;
}
};