977.有序数组的平方
看完思路后一遍AC
- 思路剖析:
- 因为提到了时间复杂度为O(n),自然想到只能遍历一遍
- 又因为只规定了时间复杂度,但是没有规定空间复杂度,所以可以考虑在定义一个数组【这一步没有考虑出来,是看了思路的】
- 因为前一天做了二分查找,其实是考虑到使用双指针的思想,也在用这个思路思考,但是一直想着在同一个数组之内排序,没有想到重新定一个空的数组;
class Solution {
public int[] sortedSquares(int[] nums) {
int[] new_nums = new int[nums.length];
int i = 0, j = nums.length - 1;
for (int k = nums.length - 1; k >= 0; k--) {
if (nums[i] * nums[i] <= nums[j] * nums[j]) {
new_nums[k] = nums[j] * nums[j];
j--;
} else {
new_nums[k] = nums[i] * nums[i];
i++;
}
}
return new_nums;
}
}
209.长度最小的子数组
第一遍
- 思路:判断最小长度,而且要时间复杂度是
O(n log(n))
,想到这样的话,只能最多for
循环一遍,因此想到了双指针的算法; - 这一遍写了20mins,打了很多补丁,总是有逻辑上的错误导致代码死循环,因此放弃自己想,看了一下代码随想录;
- 发现思路是差不多,但区别是:
- 我是一直通过判断最小的长度来不断更改结果;
- 随想录里面是通过判断i,j之间的数字之和来不断更改结果;
- 因此,果断删除现有逻辑,开始着手随想录逻辑;
class Solution {
public int minSubArrayLen(int[] nums, int target) {
int min_len = nums.length + 1;
int i = 0, j = 0;
while (j < nums.length) {
int sum = 0;
for (int k = i; k >= i & k <= j; k++) {
sum += nums[k];
}
if (sum >= target) {
int tmp_len = j - i + 1;
if (min_len == tmp_len) {
i++;
j++;
continue;
}
min_len = min_len > tmp_len ? j - i++ + 1 : min_len;
} else {
j++;
}
}
return min_len == nums.length + 1 ? 0 : min_len;
}
}
第二遍
class Solution {
public int minSubArrayLen(int[] nums, int target) {
int min_len = nums.length + 1;
int i = 0, sum = 0;
for (int j = 0; j < nums.length; j++) {
sum += nums[j];
while (sum >= target) {
min_len = Math.min(j - i + 1, min_len);
sum -= nums[i++];
}
}
return min_len == nums.length + 1 ? 0 : min_len;
}
}
59.螺旋矩阵II
第一遍
- 思路:第一遍的思路是如何判断每次遍历结束的节点,但是总是会有这样那样的漏洞,补丁打了二十分钟也没有完成思路,于是看了代码随想录;
- 重点:
- 循环不变原则,每次总是要保持左闭右开的遍历方式;
- 学会通过多个参数去保持遍历的准确性;
- 没有想到可以用循环圈数作为while条件;
- 代码里面还有一个重点,注释+debug理解起来会更容易比较容易;
import java.util.Arrays;
public class test {
public static void main(String[] args) {
int n = 4;
Solution s = new Solution();
int[][] result = s.generateMatrix(n);
for (int i = 0; i < n; i++) {
System.out.println(Arrays.toString(result[i]));
}
}
}
class Solution {
public int[][] generateMatrix(int n) {
int[][] result = new int[n][n];
int loop = 0;
int i = 0, j = 0;
int start_x = 0, start_y = 0;
int offset = 1;
int count = 1;
while (loop++ < n / 2) {
for (j = start_x; j < n - offset; j++) {
result[start_y][j] = count++;
}
for (i = start_y; i < n - offset; i++) {
result[i][j] = count++;
}
for (; j > start_y; j--) {
result[i][j] = count++;
}
for (; i > start_x; i--) {
result[i][j] = count++;
}
start_x++;
start_y++;
offset++;
}
if (n % 2 == 1) {
result[n / 2][n / 2] = count;
}
return result;
}
}