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

977. 有序数组的平方

import java.lang.reflect.Array;
import java.util.Arrays;

public class day2_977_有序数组的平方 {
    public static void main(String[] args) {
        int demo[]={-4,-1,0,3,10};
        System.out.println(Arrays.toString(sortedSquares(demo)));
    }
    public static int[] sortedSquares(int[] nums) {
        //自己的思路:开头一个指针,结尾一个指针,然后新建一个数组,从后往前填充,直到两个正指针碰到(验证正确)
        int len=nums.length;
        int res[]=new int[len];
        int left=0;
        int right=len-1;
        int now=len-1;
        //进入循环
        while (left<=right) {
            if (nums[left] * nums[left] > nums[right] * nums[right]) {
                res[now]=nums[left] * nums[left];
                left+=1;
                
            }else{
                res[now]=nums[right] * nums[right];
                right-=1;
            }
            now-=1;
            
        }
        return res;


    }
    
}

这题主要运用快慢指针的方法,两个指针一个从前一个从后面取元素,然后比较大小然后根据判断结果取移动指针,直到两个指针碰到,训话结束,得到期望结果。

209. 长度最小的子数组

public class day2_209_长度最小的子数组 {
    public static void main(String[] args) {
        int demo[]={5,1,3,5,10,7,4,9,2,8};
        System.out.println(minSubArrayLen(15, demo));
        
    }
    public static int minSubArrayLen(int target, int[] nums) {
        //滑动窗口
        int max=Integer.MAX_VALUE;
        int i=0;
        int sum=0;
        int len=0;
        
        for(int j=0;j<nums.length;j++){
            //依靠快指针进行遍历
            sum+=nums[j];
            while (sum>=target) {
                len=j-i+1;//得到了此时的数组长度
                max=Math.min(max, len);
                //这里是记录当前最小的长度
                //接下来去更新j的位置
                sum=sum-nums[i];
                i+=1;
            }
            
        }
        if (max==Integer.MAX_VALUE) {
            return 0;
            
        }

    
        return max;

    }
}
    

这题的主要思路也是快慢指针,j是快指针,他先去往后面跑,直到遇到符合要求的数组,接着i往后跑,尽量缩小数组的值,然后记录下当前j值的最小数组的长度,然后去遍历每一个j值可能得数组的长度。记录下来最小的结果即可。

59. 螺旋矩阵||


public class day2_59_螺旋矩阵二 {
    public static void main(String[] args) {
        int r=4;
        for(int row=0;row<generateMatrix(r).length;row++){
            for(int col=0;col<generateMatrix(r)[row].length;col++){
                System.out.print(generateMatrix(r)[row][col]+" ");
            }
            System.out.println();
        }
    }
    public static int[][] generateMatrix(int n) {
        //因为是平方,所以一直成立
        int[][] res=new int[n][n];
        //这题主要是模拟过程
        //循环不变量 
        //左闭右开
        // 00 11 22 33这可以看做是每次循环的开始
        //n/2这是上界
        //00 01 02 12 22 21 20  右加 左加 右减 右加的边界是n 左加也是n 右减到 这个n和第几次有关 
        int num=(n)/2;//这是除以2然后向上取证,也就是的到了循环次数
        int a=1;//这个a代表的是第几个数
        int startx=0;
        int starty=0;//这两个是每一圈的起始位置,记得更新,那么末尾的xy就是n-1-lop

        int lop=0;
        while (lop<num) {
            //这个lop代表的是第几圈
            //00 01 .02 12.22 21.11  10
            for(int j=starty;j<n-1-lop;j++){
                res[startx][j]=a;
                a+=1;
            }
            for(int i=startx;i<n-1-lop;i++){
                res[i][n-1-lop]=a;
                a+=1;//这里的巧妙地方在于这个y的取值是n-1-lop也就是上一个循环的终止条件。
            }
            for(int j=n-1-lop;j>lop;j--){
                res[n-1-lop][j]=a;
                a+=1;
            }
            for(int i=n-1-lop;i>lop;i--){
                res[i][lop]=a;
                a+=1;
            }
            startx+=1;
            starty+=1;
            lop+=1;

            
        }
        if (n%2!=0) {
            res[n/2][n/2]=n*n;
            
        }
        return res;

    }
    
}

这题主要不是考察算法,主要是去模拟一个旋转过程,为了方便控制过程,采取了左闭右开的方案,采用其他的也行,合理即可,然后就是去控制边界,有一个点需要注意一下,就是技术偶数的问题,一开始自己想的是向上取证,把技术偶数的情况直接放到循环中去解决,后来发现很麻烦,不如直接在程序末尾直接进行判断,让后把那个数 n的平方填进去方便,主要是就只这个边界条件不好控制。这里的问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值