977.有序数组的平方
思路:
这一题使用双指针的方法,一个指向数组头一个指向数组尾,将符合条件的元素放入新数组,移动指针。
class Solution {
public int[] sortedSquares(int[] nums) {
int[] res = new int[nums.length];
int k = nums.length - 1;
for (int i = 0, j = nums.length - 1; i <= j;) {
if (nums[i] * nums[i] > nums[j] * nums[j]) {
res[k--] = nums[i] * nums[i];
i++;
} else {
res[k--] = nums[j] * nums[j];
j--;
}
}
return res;
}
}
209.长度最小的子数组
这一题考察的是滑动窗口,也是使用双指针来实现。
注意,for循环中的变量为滑动窗口的末端,如果是前端的话,则循环的内容与暴力法无异,复杂度为O(n)
有一些细节需要注意,如sum>=target使用的是while而不是if;
在最后需要判断一下滑动窗口是否存在
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int res = Integer.MAX_VALUE;
int i = 0, sum = 0;
for (int j = 0; j < nums.length; j++) {
sum += nums[j];
while (sum >= target) {
res = Math.min(res, j - i + 1);
sum -= nums[i++];
}
}
res = (res == Integer.MAX_VALUE) ? 0 : res;
return res;
}
}
59.螺旋矩阵II
有两种做法
第一种的leetcode上的题解,采取的是左闭右闭的方法,注意边界
class Solution {
public int[][] generateMatrix(int n) {
int[][] ans = new int[n][n];
int l = 0, r = n - 1, t = 0, b = n - 1;
int num = 1;
while (num <= n * n) {
for (int i = l; i <= r; i++) ans[t][i] = num++;
t++;
for (int i = t; i <= b; i++) ans[i][r] = num++;
r--;
for (int i = r; i >= l; i--) ans[b][i] = num++;
b--;
for (int i = b; i >= t; i--) ans[i][l] = num++;
l++;
}
return ans;
}
}
第二种是卡尔的解法,感觉更加容易理解
class Solution {
public int[][] generateMatrix(int n) {
int[][] ans = new int[n][n];
int startX = 0;
int startY = 0;
int var = 1;
int offset = 1;
for (int time = 0; time < n / 2; time++) {
int i = startX, j = startY;
for (; j < n - offset; j++) ans[i][j] = var++;
for (; i < n - offset; i++) ans[i][j] = var++;
for (; j > startY; j--) ans[i][j] = var++;
for (; i > startX; i--) ans[i][j] = var++;
startX++;
startY++;
offset += 1;
}
if (n % 2 == 1) {
ans[n / 2][n / 2] = var;
}
return ans;
}
}
这一题的思路并不难,但是边界条件可以说是非常恶心,需要注意