代码随想录算法训练营| 209.长度最小的子数组、 59.螺旋矩阵II

参考文章

209.长度最小的子数组

题目链接

思路:设置首尾指针,首尾指针初始位置相同,未指针逐个遍历数组并用sum储存它们的和,当sum≥target时,计算最小的数组大小,用sum减去当前首指针位置指向的值,首指针前移,持续循环直到sum<target,尾指针再开始移动。最后得到结果result

代码:

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int result=Integer.MAX_VALUE;
        int sum=0;
        int j=0;//初始指针
        // for(int i=0;i<nums.length;i++){
        //     sum=0;
        //     for(int j=i;j<nums.length;j++){
        //         sum+=nums[j];
        //         if(sum>=target){
        //             result = Math.min(result, j-i + 1);
        //             break;
        //         }
        //     }
            
        // }
        for(int i=0;i<nums.length;i++){//i是尾指针
            sum+=nums[i];
            while(sum>=target){//当数组和大于target时
                result=Math.min(result,i-j+1);//存储最小长度
                sum-=nums[j++];//并将初始指针指向位置的值删除,且前移一个位置
            }//继续判断sum是否大于目标值
        }
        return result == Integer.MAX_VALUE ? 0 : result;
    }
}

 59.螺旋矩阵II

题目链接

思路:整体设计一个左闭右开的原则(不是真正意义上的左闭右开)然后对每一条边进行for循环遍历,四条边遍历完后,缩小圈的范围,继续遍历,直到圈总数为 n/2 即停止while循环

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] nums=new int[n][n];
        int startX=0,startY=0;//初始行值和初始列值
        int loop=1;//圈数
        int offset=1;//用于控制每一条边的遍历长度
        int count=1;//记录数组中的数值
        int i,j;//代表行和列

        while(loop<=n/2){//由题目示例可知,转的圈数总数为n/2
            //上部
            //行不变,列变,左闭右开,直到列值等于n-offset-1(因为右部也是左闭右开,所以不能取到n-offset)
            for(j=startY;j<n-offset;j++){
                nums[startX][j]=count++;
            }
            //右部
            //列不变,行变,左闭右开,直到行值等于n-offset-1(因为下部部也是左闭右开,所以不能取到n-offset)
            for(i=startX;i<n-offset;i++){
                nums[i][j]=count++;
            }
            //下部
            //下部是从右边开始的(这里为了方便就把右边当成了左边,即左闭右开),直到startX-1
            for(;j>startY;j--){
                nums[i][j]=count++;
            }
            //左部
            //左部是从下边开始的(这里为了方便就把下边当成了左边,即左闭右开),直到startY-1
            for(;i>startX;i--){
                nums[i][j]=count++;
            }
            startX++;//依次更新初始行值和初始列值
            startY++;
            offset++;//更新控制每条边的遍历的长度,每缩一圈,offset加一(即每圈行列就会相应减少1)
            loop++;//更新当前圈数,用于与 n/2 比较
        }
        if(n%2==1){//当n是奇数时,矩阵的中心位置是空缺的,要把中心值给补上
            nums[startX][startY]=count;
        }
        return nums;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值