[LeetCode] 209. 长度最小的子数组
二刷的时候这一题还是有一点点吃力, 稍微费了一点点时间做出来了, 今天再写以后, 把代码又稍微精简了一些. 整体来说难度不是很高, 因为有动态窗口, 所以整个数据的变化是动态的, 思考起来就会费尽一些.
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int left = 0;
int sum = 0;
int result = -1;
for (int right = 0; right < nums.length; right++) {
sum += nums[right];
// 这里要判断 sum 和 target 以及 left 和 right
// 当 left == right 的时候, for 循环完 sum 可能为 0
// 而这时候如果 target = 0, 会导致数组越界的崩溃
while (sum >= target && left <= right) {
if (result == -1) {
result = right - left + 1;
} else {
result = Math.min(result, right - left + 1);
}
sum -= nums[left++];
}
}
return result == -1 ? 0 : result;
}
}
[LeetCode] 59. 螺旋矩阵 II
利用 int circle 记录一下当前的螺旋圈数, 对于正方形螺旋的最外边, 顶边的横坐标就是从上往下下层 circle 层, 底边就是横坐标左边就是从下往上压缩 circle 层(n - circle), 右边就是纵坐标从右往左压缩 circle 层(n - circle), 左边就是纵坐标从左往右推进 circle 层.
class Solution {
public int[][] generateMatrix(int n) {
int[][] result = new int[n][n];
int number = 1;
for (int circle = 0; circle < n/2; circle++) {
// 最上面一排, 不包括最右边一格
for (int i = circle; i < n - circle - 1; i++) {
result[circle][i] = number++;
}
// 最右边一列, 不包括最底部一格
for (int i = circle; i < n - circle - 1; i++) {
result[i][n - circle - 1] = number++;
}
// 最下面一排, 不包括最左边一格
for (int i = n - circle - 1; i > circle; i--) {
result[n - circle - 1][i] = number++;
}
// 最左边一列, 不包括最顶上一格
for (int i = n - circle - 1; i > circle; i--) {
result[i][circle] = number++;
}
}
if (n%2 != 0) {
result[n/2][n/2] = number;
}
return result;
}
}