和为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 的子数组数量
解题步骤
外层循环遍历起始位置
for (int i = 0; i < nums.length; i++) {
变量
i
表示子数组的起始位置从数组的第一个元素开始,逐步移动到最后一个元素
内层循环遍历结束位置
for (int j = i; j < nums.length; j++) {
变量
j
表示子数组的结束位置从起始位置
i
开始,逐步扩展到数组末尾
计算子数组和
sum += nums[j];
sum
变量累计从i
到j
的元素和每次内层循环添加一个新元素到当前子数组
检查和是否等于 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
阶你才能到达楼顶。
每次你可以爬 1
或 2
个台阶。你有多少种不同的方法可以爬到楼顶呢?
示例 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=1
到 n=4
的结果:
n=1
→ 1 种(1
)n=2
→ 2 种(1+1
或2
)n=3
→ 3 种(见上例)n=4
→ 5 种(自己试试列举)
发现了吗?从第3阶开始,方法数 = 前两阶方法数之和!
即:f(n) = f(n-1) + f(n-2)
(比如 f(3)=f(2)+f(1)=2+1=3
)
步骤分解
初始化变量:
a = 1
:表示到达第1个台阶有1种方法(1步)b = 2
:表示到达第2个台阶有2种方法(1+1步或直接2步)c = a + b = 3
:表示到达第3个台阶的方法数
基本情况处理:
如果n=1,直接返回1
如果n=2,直接返回2
循环计算:
对于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;
}
}