JAVA二刷-DAY2 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

JAVA二刷-DAY2 | 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

有序数组的平方

LeetCode题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/

解题思路

  先看题目,给定一个非递减顺序排序的整数数组,返回数字平方组成的新数组,同时新数组也要非递减顺序排序。平方很简单,对原位置进行一次平方计算,同时,因为需要对两个位置的元素进行对比操作,因此需要考虑双指针法进行操作。

  由于有正有负,并且非递减,因此大的平方数一定是从两边开始逼近。所以一个设置在左边界,一个设置在右边界。

AC代码:

class Solution {
    public int[] sortedSquares(int[] nums) {
        int left = 0, right = nums.length - 1,point = nums.length - 1;

        int[] result = new int[nums.length];
        while (left <= right) {
            if (Math.abs(nums[left]) > Math.abs(nums[right])) {
                result[point] = (int)Math.pow(nums[left], 2);
                point--;
                left++;
            }else {
                result[point] = (int)Math.pow(nums[right], 2);
                point--;
                right--;
            }
        }
        return result;
    }
}

长度最小的子数组

LeetCode题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/

解题思路

  要求得数组中满足 > = t a r g e t >=target >=target的长度最小连续子数组,那么首先要确定有一个保存长度的变量len。 对于计算满足目标的连续子数组,可以直接用for循环来完成,设计一个sum变量进行累加,即可得到当索引为多少时,从0开始的子数组可以达到目标。

  此后,已知目前连续子数组已经到达目标,则后续再进行向前迭代,均大于目标值。因此转过头来求得最小长度范围。即设置一个从0开始的新索引。通过逐个递减的方式,查找出当前满足目标情况下的最小长度。

  当连续子数组无法满足目标时,则重新迭代右侧边界。具体代码如下:

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

螺旋矩阵II

LeetCode题目链接:https://leetcode.cn/problems/spiral-matrix-ii/

解题思路

  填充螺旋矩阵,乍一看需要处理四个边的情况,同时还要判定每次的结束,存在问题。但应当对其进行简化,将其每一条边都当做一个左闭右开的数组进行填充。同时将其看做为多了一个增加方向的一维数组填充,那么索引也应当用两个变量来进行定义。

  此后,四条边的定义可以得到四条循环语句,之后判定跳出以及特殊情况(奇数的边长)进行特殊处理,特别注意二维数组的定义方式,以及四条边进行向内部更新的迭代方式,使用offset来限制右边界,同时将X,Y变量初始值更新,来限制左边界。

具体代码如下:

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] result = new int[n][n];
        int startX = 0, startY = 0, index = 1;
        if (n%2 == 1){
            result[n/2][n/2] = n*n;
        }

        for (int offset = 0; offset < n/2; offset++) {
            startX = offset;
            startY = offset;
            for (; startY < n - offset - 1; startY++){
                result[startX][startY] = index++;
            }
            for (; startX < n - offset - 1; startX++){
                result[startX][startY] = index++;
            }
            for (; startY > offset ; startY--){
                result[startX][startY] = index++;
            }
            for (; startX > offset ; startX--){
                result[startX][startY] = index++;
            }
        }

        return result;
    }
}

你可能感兴趣的:(java,矩阵,算法)