[二刷] 代码随想录算法训练营第二天| 209. 长度最小的子数组、59. 螺旋矩阵 II

[LeetCode] 209. 长度最小的子数组

[KamaCoder] 209. 长度最小的子数组 文章解释

[LeetCode] 209. 长度最小的子数组

二刷的时候这一题还是有一点点吃力, 稍微费了一点点时间做出来了, 今天再写以后, 把代码又稍微精简了一些. 整体来说难度不是很高, 因为有动态窗口, 所以整个数据的变化是动态的, 思考起来就会费尽一些.

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int left = 0;
        int sum = 0;
        int result = -1;

        for (int right = 0; right < nums.length; right++) {
            sum += nums[right];
            // 这里要判断 sum 和 target 以及 left 和 right
            // 当 left == right 的时候, for 循环完 sum 可能为 0
            // 而这时候如果 target = 0, 会导致数组越界的崩溃
            while (sum >= target && left <= right) {
                if (result == -1) {
                    result = right - left + 1;
                } else {
                    result = Math.min(result, right - left + 1);
                }
                sum -= nums[left++];
            }
        }
        return result == -1 ? 0 : result;
    }
}

[LeetCode] 59. 螺旋矩阵 II

[LeetCode] 59. 螺旋矩阵 II 文章解释

[LeetCode] 59. 螺旋矩阵 II

利用 int circle  记录一下当前的螺旋圈数, 对于正方形螺旋的最外边, 顶边的横坐标就是从上往下下层 circle 层, 底边就是横坐标左边就是从下往上压缩 circle 层(n - circle), 右边就是纵坐标从右往左压缩 circle 层(n - circle), 左边就是纵坐标从左往右推进 circle 层.

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] result = new int[n][n];
        int number = 1;
        for (int circle = 0; circle < n/2; circle++) {
            // 最上面一排, 不包括最右边一格
            for (int i = circle; i < n - circle - 1; i++) {
                result[circle][i] = number++;
            }
            // 最右边一列, 不包括最底部一格
            for (int i = circle; i < n - circle - 1; i++) {
                result[i][n - circle - 1] = number++;
            }
            // 最下面一排, 不包括最左边一格
            for (int i = n - circle - 1; i > circle; i--) {
                result[n - circle - 1][i] = number++;
            }
            // 最左边一列, 不包括最顶上一格
            for (int i = n - circle - 1; i > circle; i--) {
                result[i][circle] = number++;
            }
        }
        if (n%2 != 0) {
            result[n/2][n/2] = number;
        }
        return result;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值