代码随想录算法训练营第二天【数组】977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II
977.有序数组的平方
核心:双指针
心得:虽然做出来了,用到了双指针的思想,但代码过于复杂,有很多地方都可以再优化。
1)while内的if判断,没必要拆成三个条件,直接用<=和>就可以了,while条件改为left<=right,while外面的if判断也去掉
2)不应该从下标0开始存储,再倒排。应该直接从最后一位开始存储,存储也直接存平方
优化前:
class Solution { public int[] sortedSquares(int[] nums) { int len = nums.length; int left = 0; int right = len-1; int[] result = new int[len]; int[] result2 = new int[len]; int p = 0; while(left < right){ if(nums[left]*nums[left] == nums[right]*nums[right]){ result[p++] = nums[left++]; result[p++] = nums[right--]; } else if(nums[left]*nums[left] > nums[right]*nums[right]){ result[p++] = nums[left++]; }else if(nums[left]*nums[left] < nums[right]*nums[right]){ result[p++] = nums[right--]; } } if(left == right){ result[p] = nums[left]; } for(int i=len-1;i>=0;i--){ result2[i] = result[len-1-i]* result[len-1-i]; } return result2; } }
优化后:
class Solution { public int[] sortedSquares(int[] nums) { int len = nums.length; int left = 0; int right = len-1; int[] result = new int[len]; int p = len-1; while(left <= right){ if(nums[left]*nums[left] > nums[right]*nums[right]){ result[p--] = nums[left]*nums[left]; left++; }else if(nums[left]*nums[left] <= nums[right]*nums[right]){ result[p--] = nums[right]*nums[right]; right--; } } return result; } }
209.长度最小的子数组
核心:滑动窗口
心得:之前了解过滑动窗口,所以这道题的思路是有的,有几个细节掌握的还不好
1)滑动窗口的右边界应该是从0一直到最右边的,所以采用for循环遍历
2)每当sum满足条件时,为了缩短长度,需要把左边界也往右靠,所以采用while条件
3)每次找到一个符合条件的子数组,就会计算长度,最小长度的初始值应该是数组长度+1,因为如果存在子数组,最大的长度就是数组长度。全部遍历完成后,如果没有满足条件的子数组,min就还是数组长度+1,这时返回0;如果有满足条件的子数组,min就会更新成子数的长度。
class Solution { public int minSubArrayLen(int target, int[] nums) { int sum = 0; int len = nums.length; int left = 0; int min = len+1; for(int right=0;right<len;right++){ sum = sum+nums[right]; while(sum>=target){ min = Math.min(min,right-left+1); sum = sum-nums[left]; left++; } } return min==len+1?0:min; } }
59.螺旋矩阵II
心得:转圈的时候保持一致性,左闭右开
class Solution { public int[][] generateMatrix(int n) { int[][] nums = new int[n][n]; int start = 0; int loop = 0; int count = 1; int i,j; while(n/2 > loop++){ for(j=start;j<n-loop;j++){ nums[start][j] = count++; } for(i=start;i<n-loop;i++){ nums[i][j] = count++; } for(;j>=loop;j--){ nums[i][j] = count++; } for(;i>=loop;i--){ nums[i][j] = count++; } start++; } if(n%2 == 1){ nums[start][start] = count++; } return nums; } }
浙公网安备 33010602011771号