day2任务

1.长度最小的子数组:代码随想录

使用滑动窗口解题,也是相当于双指针,只是实现过程像窗口滑动才叫滑动窗口。

/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2024-2024. All rights reserved.
 */

package TrainingCamp;

/**
 *  长度最小的子数组
 *
 *  https://leetcode.cn/problems/minimum-size-subarray-sum/
 *
 *  滑动窗口 / 双指针 / 暴力循环(超时)
 */
public class _2_1MinLengthSubarray {
    private static int findMinLenArr(int[] nums, int target) {      //滑动窗口毛毛虫
        //判断是否为空
        if (nums.length == 0) {
            return 0;
        }
        int sum = 0;
        int left = 0;
        int result = Integer.MAX_VALUE;     //result存放的是子数组的长度,最开始得存最大长度,后面碰到小的替换下就行
        for (int right = 0; right < nums.length; right++) {
            /**
             *  个人感觉for循环里面这个已经相当于一个模板了
             *  可以理解为 毛毛虫减肥,但是还得满足最低食量,找到满足食量的最简单吃法
             *  前后指针的移动过程理解为毛毛虫蠕动
             *
             *  先吃一个进去(头指针)
             *  判断下有没有吃撑,吃撑了就
             *      对比一下是不是最简单的吃法
             *      再拉(尾指针)一个出来
             *  还撑的话继续拉,直到吃不够了
             */
            sum += nums[right];
            while (sum >= target) {
                result = Math.min(result, right - left + 1);
                sum -= nums[left++];
            }
        }
        return result == Integer.MAX_VALUE ? 0 : result;
    }

    public static void main(String[] args) {
        int[] nums = {2, 3, 1, 2, 4, 9, 9, 9, 9, 3};
        int target = 7;
        System.out.println(findMinLenArr(nums, target));
    }
}

注意while循环,不是if,左边可以减好几次

注意result的声明

滑动窗口其实就是变化的双指针,类似毛毛虫吃东西,少了吃,多了拉,一个首一个尾。

2.螺旋矩阵:代码随想录

学习到了模拟转圈的过程,但是个人感觉肯定会忘,螺旋矩阵的题还需要再巩固一下,周末可以复习复习。

package LuStudy;

import java.util.Arrays;

/*
 *  螺旋矩阵II
 * 
 *  https://leetcode.cn/problems/spiral-matrix-ii/
 * 
 */
public class _2_2SpiralMatrix {
    private static int[][] findSpiralMatrix(int n) {
        int[][] nums = new int[n][n];
        int startX = 0, startY = 0; // 每次循环不变量的坐标,每转一圈才更新一次
        int offSet = 1; // 右区间的宽度,保持左闭右开
        int loop = 1; // 圈数
        int count = 1; // 题目条件
        int i, j; // 旋转行或者列

        while (loop <= n / 2) {
            for (j = startY; j < n - offSet; j++) {
                nums[startX][j] = count++;

            }

            for (i = startX; i < n - offSet; i++) {
                nums[i][j] = count++;

            }

            for (; j > startY; j--) {
                nums[i][j] = count++;

            }

            for (; i > startX; i--) {
                nums[i][j] = count++;

            }

            startX++;
            startY++;
            loop++;
            offSet++;

            if (n / 2 == 1) {
                nums[startX][startY] = count;
            }
        }
        return nums;
    }

    public static void main(String[] args) {
        int n = 4;
        System.out.println(Arrays.deepToString(findSpiralMatrix(n)));
    }
}

3.区间和:58. 区间和 | 代码随想录 (programmercarl.com)

链接:58. 区间和(第九期模拟笔试)

前缀和的扩充,没啥难度。

4.开发商购买土地

还没刷,周末试试这个扩展题。休息休息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值