977.有序数组的平方
题目链接:977. 有序数组的平方 - 力扣(LeetCode)
我的思考:先平方再排序,但是这样的时间复杂度好像超过O(n);
代码随想录中的方法:
因为是个有正有负的递增数组,元素平方后的结果肯定是从数组两边向中间从大到小。因此用两个指针分别指向数组的开头和数组的结尾,两个指针都向中间移动。
由于要求返回的数组是递增的,所以将指针指到的元素依次从数组的末尾向前存入新数组。
代码:
class Solution {
public int[] sortedSquares(int[] nums) {
int len = nums.length;
int left = 0;
int right = len - 1;
int middle = len - 1;
int[] newArr = new int[len];
while (left <= right) {
int rightSqu = nums[right] * nums[right];
int leftSqu = nums[left] * nums[left];
if (leftSqu <= rightSqu) {
newArr[middle] = rightSqu;
right --;
} else {
newArr[middle] = leftSqu;
left ++;
}
middle --;
}
return newArr;
}
}
209.长度最小的子数组
题目链接:209. 长度最小的子数组 - 力扣(LeetCode)
我的解题思路:
因为以前做过,所以有印象要用滑动窗口,大概实现思路是:先从数组第一个元素开始,往后移加元素求和,直到sum>=target(此时用两个指针分别指向首元素以及求和的尾元素),此时窗口形成,记录窗口长度windowSize,开始移动。
移动的过程中:先移右指针right,当移动后的窗口总和sum>target时,收缩左指针left,当收缩到sum<target时,更新windowSize,重新开始移动右指针,循环结束后,返回最小的windowSize。
1. 外层for循环移动的是终止位置还是起始位置?如果是起始位置,那么跟使用两层for循环本质就一样了。所以是终止位置。
2. 那起始位置怎么移动?当终止位置增加到sum>target时,记录当前窗口长度,开始移动起始位置(使用内层while循环),每移动一次,sum减去当前起始位置的元素值,直到sum不再大于target。
代码:
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int sum = 0;
int len = nums.length;
int left = 0;
int windowSize = 0;
int count = Integer.MAX_VALUE;
for (int right = 0; right < len; right ++) {
sum += nums[right];
while (sum >= target) {
windowSize = right - left + 1;
count = Math.min(windowSize, count);
sum -= nums[left];
left ++;
}
}
if (count == Integer.MAX_VALUE) return 0;
return count;
}
}
59.螺旋矩阵II
题目链接:59. 螺旋矩阵 II - 力扣(LeetCode)
我的思路:无,之前做过,但完全不记得怎么做了。-_-
1. 确定循环不变量:每一次循环不变的是边界判断条件,这里是左闭右开,每一条边都遵循不处理最右边那个值。
2. 首先确定转几圈:n/2,那么如果n是奇数,只要在最后判断一下,如果是奇数,就把最中间那个值直接赋值进去就好。
3. 一圈转完以后改变边界的值,分别加一减一,横坐标i++,纵坐标j++、
代码:
class Solution {
public int[][] generateMatrix(int n) {
int left = 0;
int right = n - 1;
int up = 0;
int down = n - 1;
int[][] matrix = new int[n][n];
int i = 0,j = 0;
int sum = 0;
for(int loop = 0;loop < n/2; loop++) {
for(j = left; j < right;j++) {
sum++;
matrix[i][j] = sum;
}
for(i = up; i < down; i++) {
sum++;
matrix[i][j] = sum;
}
for(j = right; j > left; j--) {
sum++;
matrix[i][j] = sum;
}
for(i = down; i > up; i--) {
sum++;
matrix[i][j] = sum;
}
i++;
j++;
up++;
down--;
right--;
left++;
}
if (n % 2 == 1) matrix[n / 2][n / 2] = n * n;
return matrix;
}
}
看了一下大概的思路之后自己写的,感觉不是很优雅,再改改。
第二天完结撒花!
下班回家。