代码随想录 第二天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II ,总结
LeetCode977:977. 有序数组的平方 - 力扣(LeetCode)
思路:一开始自己写还是冒泡。看了代码以后发现还有一种新思路,双指针来完成。
双指针:创建一个新数组,判断最左边和最右边两个平方后的大小,谁大就给新数组赋值。赋值到最后就是递增排序了,之前的暴力for循环后用冒泡或者是快排的时间复杂度都比这个慢,这个是n。
class Solution { public int[] sortedSquares(int[] nums) { int right = nums.length - 1; int left = 0; int[] result = new int[nums.length]; int index = result.length - 1; while (left <= right) { if (nums[left] * nums[left] > nums[right] * nums[right]) { // 正数的相对位置是不变的, 需要调整的是负数平方后的相对位置 result[index--] = nums[left] * nums[left]; ++left; } else { result[index--] = nums[right] * nums[right]; --right; } } return result; } }
LeetCode.209. 长度最小的子数组 - 力扣(LeetCode)
思路:之前了解过,所以开始想的就是滑动窗口,一个for循环来从0判断到末尾,如果>=target值就把最左侧值减去,也就是减去一开始加上的起始值,这样窗口才能滑动起来,不满足target值就往前加一位。
问题:大体思路有,在写代码时还是比较困难,需要多写几遍体会。
class Solution { // 滑动窗口 public int minSubArrayLen(int s, int[] nums) { int left = 0; int sum = 0; int result = Integer.MAX_VALUE; for (int right = 0; right < nums.length; right++) { sum += nums[right]; while (sum >= s) { result = Math.min(result, right - left + 1); sum -= nums[left++]; } } return result == Integer.MAX_VALUE ? 0 : result; } }
LeetCode:59. 螺旋矩阵 II - 力扣(LeetCode)
思路:设定矩阵的4个边角,每循环一次都要将对应的边角进行加/减
问题:对具体代码不清晰,其实整体代码就像一个魔方一样,分成四个边,每个边写完就该写里面那层,所以边界是变化的,顶层写完就应该top++,右边写完就应该right--,底边写完就应该bottom++,左边写完应该left++;
package leetcode.editor.cn; import java.util.*; public class ID59SpiralMatrixIi{ public static void main(String[] args) { Solution solution = new ID59SpiralMatrixIi().new Solution(); StringBuilder sb = new StringBuilder(); //执行测试 System.out.println(sb); } //leetcode submit region begin(Prohibit modification and deletion) class Solution { public int[][] generateMatrix(int n) { int left = 0,top = 0,right = n-1,bottom = n-1; int [][]nums=new int[n][n]; int dight = 1; int end = n*n; while(dight<=end){ //左——>右 for(int i=left;i<=right;i++){ nums[top][i]=dight++; } top++; //上-->下 for(int i=top;i<=bottom;i++){ nums[i][right]=dight++; } //右-->左 right--; for(int i=right;i>=left;i--){ nums[bottom][i]=dight++; } bottom--; //下-->上 for (int i = bottom;i>=top;i--){ nums[i][left]=dight++; } left++; } return nums; } } //leetcode submit region end(Prohibit modification and deletion) }