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

本文介绍了三个Java编程问题的解决方案:1)对有序数组计算平方并排序;2)寻找长度最小的子数组,使得其和等于给定目标;3)生成给定大小的螺旋矩阵。作者提到在处理螺旋矩阵时,依赖于循环控制策略来实现螺旋填充。
摘要由CSDN通过智能技术生成

有序数组的平方

 class Solution {
    public int[] sortedSquares(int[] nums) {
        int result[]=new int[nums.length];//新建一个数组
        int k=result.length-1;//新数组从右边开始遍历
        int i=0;//左指针
        int j=nums.length-1;//右指针
        while(i<=j)//包括=,因为如果是奇数的话就少了中间那个数没有比较 
        {
            if(nums[i]*nums[i]>nums[j]*nums[j]){
            result[k--]=nums[i]*nums[i];//从两边开始比较,将平方后大的放在新数组最右边
            i++;//左指针向右移动
            }
            else{
             result[k--]=nums[j]*nums[j];//包括了nums[i]平方=nums[j]平方的情况
             j--;//右指针向左移
            }
        }
        return result;
    }
}

长度最小的子数组

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        //双指针滑动窗口。j表示的终止位置进行遍历,i表示的起始位置。
        //j遍历使滑动窗口的总和等于大于目标值的时候,i表示的起始位置开始向后移动直至窗口内总和小于目标值。
    int result=Integer.MAX_VALUE;//max值方便比较出较小的值
    int i=0;
    int sum=0;//窗口内数字总和
    int sublength=0;//最小长度
    for(int j=0;j<nums.length;j++)//终止的指针遍历一遍数组
    {
        sum+=nums[j];//将窗口内的数字相加
        while(sum>=target)
        {
         sublength=j-i+1;//窗口内的元素个数
         result=result>sublength?sublength:result;//比较选出最小的元素个数
         sum=sum-nums[i];//动态计算滑动窗口的值
         i++;
        }
       
    }
    return result==Integer.MAX_VALUE?0:result;
    } 
}

螺旋矩阵

class Solution {
    public int[][] generateMatrix(int n) {
    int[][] nums=new int[n][n];
    int starty =0;
    int startx =0;//左闭右开的规律进行螺旋
    int count=1;//进行赋值
    int offset=1;
    int loop=0;//控制循环次数
    int i,j;
    while(loop++<n/2){//转了n/2圈
    for(j=startx;j<n-offset; j++){//假设n=4,则需要转2圈,第一圈的j(控制列)需要小于4-1=3。满足左闭右开进行螺旋
    nums[startx][j]=count++;//第一圈第一行赋值
    }
    for(i=starty;i<n-offset; i++){
    nums[i][j]=count++;//第一圈第一个列赋值
    }
    for( ;j>starty;j--){
    nums[i][j]=count++;//第一圈最下面一行
    }
    for( ;i>startx;i--){
    nums[i][j]=count++;//第一圈最左边一列
    }

    starty++;
    startx++;
    offset++;//进入第二圈  
    }
    if(n%2==1){//若是奇数,将最后剩下的中间的位置进行赋值
    nums[startx][starty]=count;
    }
    
    
     return nums;
    }
}

笔记在这里插入图片描述在这里插入图片描述

心得

做螺旋矩阵的时候我依靠自己应该想不出来转的圈数。。。while控制循环的次数感觉把握不好。loop++<n/2是硬凑出来的。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值