算法Day2 | LeetCode977有序数组的平方、209长度最小的子数组、59螺旋矩阵Ⅱ

977.有序数组的平方

力扣链接:链接
在这里插入图片描述

思路

数组是有序递增的,负数平方以后可能会比前面的大,但是最大的数一定是在两端,并且往中间递减。所以采用双指针分别指向头尾比大小,往中间移动

代码

class Solution {
    public int[] sortedSquares(int[] nums) {
        int left=0;
        int right=nums.length-1;
        int[] result=new int[nums.length];
        int p=nums.length-1;
        while(left<=right){
            if((nums[left]*nums[left])<nums[right]*nums[right]){
                result[p]=nums[right]*nums[right];
                right--;
                p--;
            }else{
                result[p]=nums[left]*nums[left];
                left++;
                p--;
            }
        }
        return result;
    }
}

209.长度最小的子数组

力扣链接:链接
在这里插入图片描述

思路

找到的子数组是连续的,所以采用滑动窗口的方法,需要注意的是大于等于target而不仅仅是等于target

代码

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int[] result=new int[nums.length];
        int left=0;
        int right=0;
        int count=0;
        int len=Integer.MAX_VALUE;
        while(right<nums.length){
            count+=nums[right];
            while(count>=target){
                len=Math.min(len,right-left+1);
                count-=nums[left];
                left++;
            }
            right++;
        }
        if(len==Integer.MAX_VALUE){
            return 0;
        }
        return len;
    }
}

59.螺旋矩阵Ⅱ

力扣链接:链接
在这里插入图片描述

思路

确定好区间以后四个方向都是相同区间,不要一会左开右闭一会左闭右开的。这里我用的是左闭右开的区间。然后确定好圈数以及每圈起始和终止位置(这里我在写从右到左,从下到上的方向时就没确定好终止条件,出现了第二圈覆盖),以及如果是奇数的话矩阵中心应该怎么处理

代码

class Solution {
    public int[][] generateMatrix(int n) {
        int loop=n/2;
        int count=1;
        int curloop=1;
        int[][] result=new int[n][n];
        int i,j;
        while(curloop<=loop){
            i=curloop-1;
            j=curloop-1;
            for(;j<n-curloop;j++){
                result[i][j]=count++;
            }
            for(;i<n-curloop;i++){
                result[i][j]=count++;
            }
            for(;j>curloop-1;j--){
                result[i][j]=count++;
            }
            for(;i>curloop-1;i--){
                result[i][j]=count++;
            }
            curloop++;
        }
        if(n%2==1){
            result[curloop-1][curloop-1]=count;
        }
        return result;
    }
}

小结

我发现好像会说非递减顺序的数组来代替说递增数组,所以看到的时候确认一下是不是说了不是连续数组。
数组基本上用的二分法(坚持循环不变量,确认好区间就不要动)、双指针法(在一个for循环下完成两个for循环需要完成的事)、滑动窗口(要找连续子序列)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值