随想录刷题笔记 —数组篇2 977有序数组平方 209长度最小子数组 59螺旋矩阵

977有序数组平方

 非递减顺序 排序的整数数组  每个数字的平方 组成的新数组

题目分析:负数正数组成的非递减数组 两边平方最大,中间平方最小

我的题解:找到正负数交界,从中间向外 比较赋值 代码非常繁冗

class Solution {
    public int[] sortedSquares(int[] nums) {
        int flag=-1;
        int[] news= new int[nums.length];
        for (int i = 0; i < nums.length; i++) {
            if (nums[i]<0){
                flag=i;
            }else {
                break;
            }
        }
        flag++;
        int small = flag-1,big = flag,count = 0;
        while (small>=0 && big < nums.length){
            int smallval = nums[small]*nums[small];
            int bigval = nums[big]*nums[big];
            if (smallval<=bigval){
                news[count] = smallval;
                small--;
            }else {
                news[count] = bigval;
                big++;
            }
            count++;
        }
        if (small>=0){
            while (small>=0){
                news[count] = nums[small]*nums[small];
                count++;
                small--;
            }
        }else if (big < nums.length){
            while (big<nums.length){
                news[count] = nums[big]*nums[big];
                count++;
                big++;
            }
        }
        return news;
    }
}

 看了其他题解:从两边向中间对比 指针相遇则结束

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

    }
}

209长度最小子数组

其和 ≥ s 的长度最小连续子数组

滑动窗口法

右指针向右移动直至 和满足,后左指针向右移动直至 和不满足 ,循环进行,从而滑动窗口

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int left = 0, right = 0, value = 0, length = nums.length, flag = 0;
        while (right< nums.length){
            while (value < target&&right<nums.length){
                value+=nums[right];
                right++;
            }
            if (value >= target){
                flag = 1;
                if (left == right){
                    return 1;
                }
                while (value >= target&&left<nums.length){
                    if (right-left<length&&value >= target){
                        length = right-left;
                    }
                    value-=nums[left];
                    left++;
                }
            }
        }
        if (flag==1){
            return length;
        }else {
            return 0;
        }
    }
}

59螺旋矩阵

元素按顺时针顺序螺旋排列

模拟螺旋填充过程 分为4步 设置填充层数 注意填充边界判断

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] matrix = new int[n][n];
        int count = 1, val = 0;
        int i=0,j=0,flag=1;
        while (val<n*n-1){
            while (j<n-count){
                val++;
                matrix[i][j]=val;
                j++;
            }
            while (i<n-count){
                val++;
                matrix[i][j]=val;
                i++;
            }
            while (j>count-1){
                val++;
                matrix[i][j]=val;
                j--;
            }
            while (i>count-1) {
                val++;
                matrix[i][j] = val;
                i--;
            }
            i++;
            j++;
            count++;
        }
        if (n%2==1){
            matrix[i][j] = val+1;
        }

        return matrix;
    }
}

收获

中间小两边大的数据 可以从两边处理 不必找中间值

滑动窗口 在求连续和 重复子字符串 等连续子问题 有重要应用

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值