977.有序数组的平方
题目链接:力扣
文章讲解:代码随想录
视频讲解: 双指针法经典题目 | LeetCode:977.有序数组的平方_哔哩哔哩_bilibili双指针法经典题目 | LeetCode:977.有序数组的平方_哔哩哔哩_bilibili双指针法经典题目 | LeetCode:977.有序数组的平方_哔哩哔哩_bilibili
- 第一想法:相向双指针,需要建立return array,时间复杂度O(n)
- 看完讲解:补充了暴力解法,时间复杂度O(n+nlogn)
209.长度最小的子数组
- 第一想法:滑动窗口
-
不知道怎么更新sum
-
class Solution { public int minSubArrayLen(int target, int[] nums) { int minLen = Integer.MAX_VALUE; int i=0; for (int j=1; j<nums.length; j++) { int sum = 0; for (int k=i; k<j; k++) { sum += nums[k]; } if (sum == target) { minLen = Math.min(minLen, j-i+1); } } if (minLen == Integer.MAX_VALUE) return 0; else return minLen; } }
-
- 看完讲解:
- 认真审题,题目要求的是subarray的sum>=target,而不是==target,因此注意while更新条件是>=不是>
- 滑动窗口的本质在于sum-=nums[i++]这一行,for loop先扩大右边的窗口,while loop再缩减左边的窗口
- 时间复杂度O(n)
-
class Solution { public int minSubArrayLen(int target, int[] nums) { int minLen = Integer.MAX_VALUE; int i=0; int sum = 0; for (int j=0; j<nums.length; j++) { sum += nums[j]; while (sum >= target) { minLen = Math.min(minLen, j-i+1); sum -= nums[i]; i++; } } if (minLen == Integer.MAX_VALUE) return 0; else return minLen; } }
- 相关题目:
59.螺旋矩阵II
题目链接:力扣
文章讲解:代码随想录
视频讲解:一入循环深似海 | LeetCode:59.螺旋矩阵II_哔哩哔哩_bilibili
- 第一想法
-
class Solution { public int[][] generateMatrix(int n) { int[][] ans = new int[n][n]; int start = 0; int offset = 1; int mid = n/2; int num = 1; while (mid >= 0) { int i = start; int j = start; for (; j<n-offset; j++) { ans[i][j] = num++; } for (; i<n-offset; i++) { ans[i][j] = num++; } for (; j>=0; j--) { ans[i][j] = num++; } for (; i>=0; i--) { ans[i][j] = num++; } mid--; offset+=2; start++; } if (n%2 == 1) ans[n/2][n/2] = num; return ans; } }
-
- 看完讲解
- 注意边界更新:offset++; start++; start也在更新,所以不是offset+=2;
- mid>0就可以,比如n=3,只需要while loop一遍,比如n=2,也只需要while loop一遍
- 注意for loop,停止条件为i>start
-
class Solution { public int[][] generateMatrix(int n) { int[][] ans = new int[n][n]; int start = 0; int offset = 1; int mid = n/2; int num = 1; while (mid > 0) { int i = start; int j = start; for (; j<n-offset; j++) { ans[i][j] = num++; } for (; i<n-offset; i++) { ans[i][j] = num++; } for (; j>start; j--) { ans[i][j] = num++; } for (; i>start; i--) { ans[i][j] = num++; } mid--; offset++; start++; } if (n%2 == 1) ans[n/2][n/2] = num; return ans; } }
- 相关题目
- 54.螺旋矩阵
- 第一想法
- 最后中间的if条件猜了一下,if (Math.min(m,n) % 2 == 1)
-
class Solution { public List<Integer> spiralOrder(int[][] matrix) { List<Integer> ans = new ArrayList<> (); int n = matrix.length; int m = matrix[0].length; int startX = 0; int startY = 0; int offset = 1; int mid = Math.min(m/2, n/2); while (mid > 0) { int j=startX; int i=startY; for (; j<m-offset; j++) { ans.add(matrix[i][j]); } for (; i<n-offset; i++) { ans.add(matrix[i][j]); } for (; j>startX; j--) { ans.add(matrix[i][j]); } for (; i>startY; i--) { ans.add(matrix[i][j]); } mid--; offset++; startX++; startY++; } if (Math.min(m,n) % 2 == 1) { offset--; if (m/2 > n/2) { mid = n/2; for (int k=startX; k<m-offset; k++) { ans.add(matrix[mid][k]); } } else { mid = m/2; for (int k=startY; k<n-offset; k++) { ans.add(matrix[k][mid]); } } } return ans; } }
- 看完讲解
- 不需要startX和startY,可以只用一个start
-
class Solution { public List<Integer> spiralOrder(int[][] matrix) { List<Integer> ans = new ArrayList<> (); int start = 0; int lenX = matrix[0].length; int lenY = matrix.length; int loop = Math.min(lenX, lenY)/2; int mid = loop; int offset = 1; while (loop>0) { int j = start; int i = start; for (; j<lenX-offset; j++) { ans.add(matrix[i][j]); } for (; i<lenY-offset; i++) { ans.add(matrix[i][j]); } for (; j>start; j--) { ans.add(matrix[i][j]); } for (; i>start; i--) { ans.add(matrix[i][j]); } start++; offset++; loop--; } if (Math.min(lenX, lenY)%2 == 1) { if (lenX>lenY) { for (int k=mid; k<mid+lenX-lenY+1; k++) { ans.add(matrix[mid][k]); } } else { for (int k=mid; k<mid+lenY-lenX+1; k++) { ans.add(matrix[k][mid]); } } } return ans; } }