wayne
wayne
发布于 2025-08-09 / 0 阅读
0
0

LeetCode - 和为K的子数组 / 爬楼梯

和为K的子数组

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 

子数组是数组中元素的连续非空序列。

 

示例 1:

输入:nums = [1,1,1], k = 2
输出:2

示例 2:

输入:nums = [1,2,3], k = 3
输出:2

 

提示:

  • 1 <= nums.length <= 2 * 104

  • -1000 <= nums[i] <= 1000

  • -107 <= k <= 107

解题思路

双循环枚举(暴力法)

核心思想

枚举所有可能的连续子数组,计算它们的和,统计和等于 K 的子数组数量

解题步骤

  1. 外层循环遍历起始位置

    for (int i = 0; i < nums.length; i++) {
    • 变量 i 表示子数组的起始位置

    • 从数组的第一个元素开始,逐步移动到最后一个元素

  2. 内层循环遍历结束位置

    for (int j = i; j < nums.length; j++) {
    • 变量 j 表示子数组的结束位置

    • 从起始位置 i 开始,逐步扩展到数组末尾

  3. 计算子数组和

    sum += nums[j];
    • sum 变量累计从 ij 的元素和

    • 每次内层循环添加一个新元素到当前子数组

  4. 检查和是否等于 K

    if (sum == k) {
        num++;
    }
    • 当子数组和等于目标值 K 时,计数器 num 增加 1

完整代码

class Solution {
    public int subarraySum(int[] nums, int k) {

        int num = 0;
        for (int i = 0; i < nums.length; i++) {
            int sum = 0;
            for (int j = i; j < nums.length; j++) {
                sum += nums[j];
                if (sum == k) {
                    num++;
                }
            }
        }
        return num;
    }
}

爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 12 个台阶。你有多少种不同的方法可以爬到楼顶呢?

 

示例 1:

输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶

示例 2:

输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶

 

提示:

  • 1 <= n <= 45

解题思路

这段代码是解决"爬楼梯"问题的动态规划实现。问题描述是:每次可以爬1或2个台阶,问爬到第n个台阶有多少种不同的方法。

规律发现

观察 n=1n=4 的结果:

  • n=1 → 1 种(1

  • n=2 → 2 种(1+12

  • n=3 → 3 种(见上例)

  • n=4 → 5 种(自己试试列举)

发现了吗?从第3阶开始,方法数 = 前两阶方法数之和
即:f(n) = f(n-1) + f(n-2)(比如 f(3)=f(2)+f(1)=2+1=3

步骤分解

  1. 初始化变量

    • a = 1:表示到达第1个台阶有1种方法(1步)

    • b = 2:表示到达第2个台阶有2种方法(1+1步或直接2步)

    • c = a + b = 3:表示到达第3个台阶的方法数

  2. 基本情况处理

    • 如果n=1,直接返回1

    • 如果n=2,直接返回2

  3. 循环计算

    • 对于n≥3的情况,通过循环计算:

      • 每次迭代将变量向前移动:a取b的值,b取c的值,然后计算新的c=a+b

      • 这个循环会执行n-3次

      • 最终c的值就是到达第n个台阶的方法数

class Solution {
    public int climbStairs(int n) {
        int a = 1;
        int b = 2;
        int c = a + b;
        if (n == 1) {
            return a;
        }
        if (n == 2) {
            return b;
        }

        while (n - 3 > 0) {
            a = b;
            b = c;
            c = a + b;
            n--;
        }
        return c;
    }
}


评论