随想录刷题笔记 —数组篇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

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

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= target){
                flag = 1;
                if (left == right){
                    return 1;
                }
                while (value >= target&&left= 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 (valcount-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;
    }
}

收获

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

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

你可能感兴趣的:(随想录刷题,笔记,算法,数据结构,java)