一、LeetCode977.有序数组的平方
阅题思路:最开始看到这道题的时候,只能想到暴力解——把原有的数组遍历一边,每一个元素平方,然后再排序。看了《代码随想录》笔记之后,学到了“双指针”的方法。
步骤拆解:
代码如下:
public static int[] sortedSquares(int[] nums) {
int length = nums.length;
// 定义双指针
int low;
int high = length - 1;
// 定义一个k指针用来给新数组赋值;
int k = high;
// 设置一个新数组,用来存放平方后的结果
int[] sortedSquares = new int[length];
// 遍历输入数组
for (low = 0; low <= high; low++) {
if (nums[low] * nums[low] <= nums[high] * nums[high]) {
// 输入数组右边的值平方更大
sortedSquares[k--] = nums[high] * nums[high];
high--;
low--;
} else {
// 左边的值平方更大
sortedSquares[k--] = nums[low] * nums[low];
}
}
return sortedSquares;
}
二、LeetCode209.长度最小的子数组
阅题思路:最开始看到这道题没有任何思路,暴力破解也没有想到,所以去看了讲解。今天是第三次写这道题,已经能够理解用“滑动窗口法”解决,但是相比称做这个叫法,我还是认为可以归类为一种“双指针法”。
步骤拆解:
代码如下:
public int minSubArrayLen(int target, int[] nums) {
// 设置快慢指针
int slow = 0;
int fast = 0;
// 设置一个sum来保存当前子数组的和
int sum = 0;
// 设置一个子序列长度的暂存值,因为后续要在while循环中取较小的
int subLength = 0;
// 给子序列长度设置初值(返回值),因为要取最小的,所以最开始初值可以设为int的最大值
int result = Integer.MAX_VALUE;
// 循环遍历数组
for (fast = 0; fast < nums.length; fast++) {
// 快指针移动,统计和
sum += nums[fast];
while (sum >= target) {
// 此时sum的值已经大于目标值,计算子序列的长度
subLength = (fast - slow) + 1;
// 先把当前最小的结果值保存起来
result = Math.min(subLength, result);
// 将慢指针向前移动,看是否还能够满足sum的要求
sum -= nums[slow];
slow++;
}
}
// 遍历完之后,只有两种情况:
// 情况一:遍历完了还没有进入while循环,说明整个数组之和都是小于target的,此时result是int的最大值
// 情况二:找到了符合题意的最小子数组,这个时候直接返回result就好
return result == Integer.MAX_VALUE ? 0 : result;
}
三、LeetCode59.螺旋矩阵Ⅱ
阅题思路:这道题看着题目直接去看了视频讲解,我觉得讲的很好;看了三遍视频,写了大概两次,现在是有思路可以实现了。
视频地址:拿下螺旋矩阵!LeetCode:59.螺旋矩阵II
代码如下:
public int[][] generateMatrix(int n) {
// 构造二维数组
int[][] matrix = new int[n][n];
// 设置坐标值 x y
int startX = 0;
int startY = 0;
// 设置圈数
int loop = 0;
// 设置循环停止/开始的偏移量
int offset = 1;
// 设置填入二维数组的值
int count = 1;
// 设置遍历的坐标值
int i = 0;
int j = 0;
// 循环遍历
// 圈数是 n / 2,奇数行列的数组把中间一块拿出来单独处理
while (loop < n / 2) {
// 遍历上方的行
for (j = startX; j < n - offset; j++) {
matrix[startX][j] = count++;
}
// 遍历右边的列
for (i = startY; i < n - offset; i++) {
matrix[i][j] = count++;
}
// 遍历下方的行
for (; j >= offset; j--) {
matrix[i][j] = count++;
}
// 遍历左边的列
for (; i >= offset; i--) {
matrix[i][j] = count++;
}
// 给一圈赋值完毕
loop++;
startX++;
startY++;
offset++;
}
// 判断是否是奇数二维数组,如果是的话,要给中间的最后一块赋值
if (n % 2 != 0) {
matrix[startX][startY] = count;
}
return matrix;
}