代码随想录算法训练营第二天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II ,总结

本文介绍了在编程挑战中涉及的三个与数组相关的题目,包括使用双指针解决的有序数组平方、长度最小子数组的滑动窗口问题,以及螺旋矩阵II的边界判断。通过实际代码演示,展示了双指针技巧在这些题目中的应用和优化。
摘要由CSDN通过智能技术生成

文档讲解:977.有序数组的平方209.长度最小的子数组59.螺旋矩阵II数组总结篇

题目链接:977.有序数组的平方209.长度最小的子数组59.螺旋数组II

视频讲解:977.有序数组的平方_哔哩哔哩_bilibili209.长度最小的子数组_哔哩哔哩_bilibili59.螺旋数组II_哔哩哔哩_bilibili

思路:

1、第一道题和昨天的移除元素差不多,都是使用的双指针,从start和end两头进行遍历,存放在新的数组中,是一道简单题目。

2、第二题是一道滑动窗口的题目,核心思想还是双指针,不过对于双指针的处理是将窗口中元素和用sum确定,而不确定元素个数,如果元素和sum大于等于target,则将左指针++,并计算最小元素个数,小于target就将右指针++,移动元素个数为2*n,所以其时间复杂度为O(n)。

3、第三道题比较难的点是边界的判断,相较于前面的题会更复杂,首先要n/2判断要执行多少圈,如果是奇数最后再加上最中间的那个元素,其次判断每一行每一列执行的过程,然后执行完一圈起始位置++,圈数也要++。

977.有序数组的平方

class Solution {
    public int[] sortedSquares(int[] nums) {
        int[] res = new int[nums.length];
        int num = nums.length-1;
        int start = 0;
        int end = nums.length-1;
        while(start<=end){
            if(nums[start]*nums[start] > nums[end]*nums[end]){
                res[num] = nums[start]*nums[start];
                num--;
                start++;
            }else{
                res[num] = nums[end]*nums[end];
                num--;
                end--;
            }
        }
        return res;
    }
}

209.长度最小的子数组

class Solution {
    public int minSubArrayLen(int target, 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>=target){
                result = Math.min(result, right-left+1);
                sum-=nums[left++];
            }
        }
        return result==Integer.MAX_VALUE ? 0:result;
    }
}

59.螺旋矩阵II

class Solution {
    public int[][] generateMatrix(int n) {
        if(n == 1){
            int[][] result = {{1}};
            return result;
        }
        int loop = 0;
        int start = 0;
        int[][] result = new int[n][n];
        int i=0,j=0;
        int num=1;

        while(loop++ < n/2){
            for(j=start;j<n-loop;j++){
                result[start][j] = num++;
            }
            for(i=start;i<n-loop;i++){
                result[i][j] = num++;
            }
            for(;j>=loop;j--){
                result[i][j] = num++;
            }
            for(;i>=loop;i--){
                result[i][j] = num++;
            }
            start++;
        }
        if(n%2==1){
            result[start][start] = num;
        }

        return result;
    }
}

总结

两天的时间做完代码随想录关于数组的题目,跟着训练营节奏走,确实很有效率,会担心掉队。这两天主要是对双指针应用的比较多,也算巩固了之前的学习成果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值