第二天
题目
对题目的想法
对有序数组的平方和螺旋矩阵感觉比较轻松,长度最小的子数组感觉有点犯难,因为滑动窗口的条件忘了。
实现中/后的感想
最麻烦的果然是滑动窗口,费时没有留意,可能在半小时到一小时之间。
这是本猪最终通过的解法:
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int sum = 0;
int slow = 0;
int fast = 0;
int result = 0;
while (fast < nums.length) {
sum = sum + nums[fast];
if (sum < target) {
fast++;
}
else {
while (slow <= fast) {
sum = sum - nums[slow];
if (sum < target)
break;
else {
slow++;
}
}
if (result == 0)
result = fast - slow + 1;
else
result = result < fast - slow + 1 ? result : fast - slow + 1;
slow++;
fast++;
}
}
return result;
}
}
- 滑动窗口困难点:
- result初始赋值为0,在第一次检测到有一个符合条件的子序列时应该直接覆盖这个初始值
if (result == 0)
result = fast - slow + 1;
else
result = result < fast - slow + 1 ? result : fast - slow + 1;
这一步一开始忘记了。
2. 当记录了一个新的result之后两个指针都要往前进。
- 螺旋矩阵:
对一个二维或者高维矩阵初始化,其实并不熟悉。在网页版编译器中稍微测试了一下才发现可以直接初始化一个高维数组。
看完代码随想录之后的想法
感想主要还是在滑动窗口的应用:
- 关于滑动窗口的返回值,可以初始赋值一个特别大的数,比如INTMAX,随后就不用多此一举写一个条件控制了。
- 毫无疑问随想录的解法更为优雅简洁。本猪在实现时有点犹豫,sum要不要第一时间加上快指针所在的值,导致后面的条件判断十分丑陋。
数组部分的总结
- 最重要的还是条件判断,也就是随想录所说的开区间和闭区间的取舍。这一点有时仅靠猪眼观察可能很容易出错,必须用纸笔演示才能发现。然鹅本猪太懒,不想动手写字,于是就降低了学习效率。
- 要看清题目条件,细读要求。这一点恐怕也不止适用于数组。
杂项
顺手又做了一下螺旋矩阵, 大部分内容和sqaure matrix类似,难点在于非平方矩阵最后的补充。
if (len < wid && len % 2 == 1) { //in the mid column, from up to down
for (int i = loop; i < wid - loop; i++)
res.add(matrix[i][loop]);
}
else if (wid < len && wid % 2 == 1) { // in the mid row, from left to right
for (int i = loop; i < len - loop; i++)
res.add(matrix[loop][i]);
}
else if (wid == len && wid % 2 == 1) {
res.add(matrix[loop][loop]);
}
这里条件控制为 (i < wid - loop), 而在内部的大循环里面为 (i < wid - loop - 1)。
从下周起又要开始忙了,不知道本猪能花多长时间专注在编程上。