代码随想录算法训练营第二天【数组】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; } }
分类:
算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?