### Day2|**977.有序数组的平方** **209.长度最小的子数组** **59.螺旋矩阵II**

文章介绍了三个数组处理的算法问题:如何对有序数组进行平方操作并保持最大元素在两侧,找到数组中和大于特定值的最小子数组长度,以及生成螺旋矩阵的方法。这些算法涉及到了数组遍历、动态规划和边界条件的处理技巧。
摘要由CSDN通过智能技术生成

“你就像一个螺旋矩阵”

|977.有序数组的平方

平方后:最大元素在两边

class Solution {
    public int[] sortedSquares(int[] nums) {
    int right = nums.length-1;
    int[] arrays = new int[nums.length];
    int len = nums.length-1;
    int left =  0;
    while(left<=right){//left==right时也会取一个元素,有意义的
     if(nums[left]*nums[left]>nums[right]*nums[right]){
         arrays[len--] =   nums[left]*nums[left];
         left++;
     }//可以用Math.pow(x,2)】
     else{
         arrays[len--] = nums[right]*nums[right];
         right--;
     }
    }
    return arrays;
    }
}

209.长度最小的子数组

//注意1e5返回的是double值,不是int类型的

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
    int sum = 0;
    int start = 0;
    int minLen = Integer.MAX_VALUE;
    int len = 0;
    for(int j =  0;j<nums.length;j++){
        //j表示终止位置
        sum+=nums[j];
        while(sum>=target){
            //终止位置确定,移动起始位置是关键
            len = j - start+1;
            if(len<minLen){
             minLen = len;
            }
            //这里可以改进:
            //minLen = Math.min(minLen,j-start+1);
            sum -= nums[start++];
        }
    }
    if(minLen== Integer.MAX_VALUE){
        return 0;
    }
    else
    return minLen;
    }
    //improvement:
    //minLen = minLen==Integer.MAX_VALUE?0:minLen
}
//改进之后的代码
class Solution {
    public int minSubArrayLen(int target, int[] nums) {
    int sum = 0;
    int start = 0;
    int minLen = Integer.MAX_VALUE;
    int j = 0;
    while(j<nums.length){
        sum += nums[j];
        while(sum>=target){
            int curLen =  j -start+1;
            minLen =Math.min(curLen,minLen);
            sum -= nums[start++];
        }
        j++;
    }
    return minLen==Integer.MAX_VALUE?0:minLen;
    }
}

59.螺旋矩阵II

每条边处理的边界原则都一样

还要解决转几圈的问题,这个是根据规律发现的:n/2

接着就是一些小细节的问题了

注意每次循环要跟着你这个代码的思路来

我们习惯用(i,j)表示坐标

class Solution {
    public int[][] generateMatrix(int n) {
    int[][] matrix = new int[n][n];
    int loop = n/2;//总圈数
    int start = 0;//startX = startY
    int offset = 1;
    int num = 1;
    int i,j;//这样可以记录我们的程序进行到哪一步了
    while(loop>0){
        for(j = start;j<n-offset;j++){
            matrix[start][j] = num++;
        }
        for(i = start;i<n-offset;i++){
            matrix[i][j] = num++;
        }
        for(;j>=offset;j--){
            matrix[i][j] = num++;
        }
        for(;i>=offset;i--){//这里最容易错,要等于
            matrix[i][j] = num++;
        }
        loop--;//圈数-1
        start++;//起始点+1
        offset++;//起始点+1意味着边界+1
    }
    if(n%2==1){
        matrix[n/2][n/2] = num;
    }
    return matrix;
}

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值