代码随想录算法训练营第二天【数组】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;
    }
}
复制代码

 

posted @   橙子的房东  阅读(407)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示