代码随想录Day_02|Leetcode.977.209.59(空间换时间,滑动窗口,螺旋数组循环不变量)

本文介绍了如何使用双指针技巧处理有序数组的平方问题,以及如何运用滑动窗口解决长度最小子数组问题。还探讨了螺旋矩阵的生成算法,通过循环不变量找出填充规律。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 977.有序数组的平方

双指针,空间换时间,最大值肯定在头尾,原数组头尾两个指针比较大小,在开辟新的数组从后往前填入,一直纠结如何原地判断,浪费了很多时间。

class Solution {
    public static int square(int number) {
        return number * number;
    }

    public int[] sortedSquares(int[] nums) {
        int high = nums.length - 1;
        int low = 0;
        int[] array = new int[nums.length];
        int k = high;
        while (low <= high) {
            if (square(nums[low]) < square(nums[high])) {
                array[k] = square(nums[high]);
                k--;
                high--;
            } else if (square(nums[low]) >= square(nums[high])) {
                array[k] = square(nums[low]);
                k--;
                low++;
            }
        }
        return array;
    }


}

 209.长度最小子数组

这个采用滑动窗口,外层for循环判断尾指针,内层while循环不断删除窗口前端的值,并且更新最短序列长度,内层while是精髓,动态调节。

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

三元运算符

return bool ? a : b ;

 bool为true返回a,否则返回b。

59.螺旋矩阵二

找循环不变量,一圈一圈的生成。

总共需要填几圈由外层while的n/2决定,每圈的每条边需要填写的个数n - (epoch - 1) * 2 - 1,如果是奇数的n需要在最后的矩阵中心额外填写一次。

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] array = new int[n][n];
        int start_x = 0;
        int start_y = 0;
        int epoch = 1;
        int num = 1;
        while (epoch <= n / 2) {
            for (int j = 0; j < n - (epoch - 1) * 2 - 1; start_y++, num++) {
                array[start_x][start_y] = num;
                j++;
            }
            for (int j = 0; j < n - (epoch - 1) * 2 - 1; start_x++, num++) {
                array[start_x][start_y] = num;
                j++;
            }
            for (int j = 0; j < n - (epoch - 1) * 2 - 1; start_y--, num++) {
                array[start_x][start_y] = num;
                j++;
            }
            for (int j = 0; j < n - (epoch - 1) * 2 - 1; start_x--, num++) {
                array[start_x][start_y] = num;
                j++;
            }
            start_x++;
            start_y++;
            epoch++;
        }
        if (n % 2 == 1) {
            int i = n / 2;
            array[i][i] = n * n;
        }
        return array;
    }
}

//runtime:0 ms
//memory:40.4 MB

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值