【Leetcode】216. 组合总和 III 解法分析
题目
- 找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
- 说明:
- 所有数字都是正整数。
- 解集不能包含重复的组合。
- 示例1:
输入: k = 3, n = 7
输出: [[1,2,4]]
- 示例2:
输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]
解题思路
在方法的开始,首先先确定所给定的k和n是否能够有解
- 给定k个数,那么这k个数的最小值为1 + 2 + … + k = (1 + k) * k / 2 //首项为1,公差为1的等差数列;
- k个数的最大值为(n - k + 1) + (n - k + 2) + … + n = (19 - k) * k / 2 //末项为9,公差为1的等差数列;
- 由此可得,只有当n >= (1 + k) * k / 2 并且 n <= (19 - k) * k / 2时才会有解,如果k和n不满足条件,则直接返回空列表。
核心思想
- 现在需要用k个数之和表示n:
- 当k = 1时,target = n,list中直接放入n;
- 当k = 2时,假定先在list中放入一个数i(1<=i<=9),那么还需要放入n - i,相当于调用k = 1情况,此时target = n - i;
- 当k = 3时,假定先在list中放入一个数i(1<=i<=9),那么还需要放入n - i,相当于调用k = 2情况,此时target = n - i;
- ·······
- 由此,我们可以发现一个规律:当我们在计算某一个k值的情况时,可以先放入一个元素i,然后递归调用target = n = i的k - 1情况,以此类推,递归终止条件即为k = 1的情况,此时如果target <= 9,那么放入target后即为我们想要的解。
- 总公式:第k个list[target = n] = [i].append(第k - 1个list[target = n - i])
- 现在需要用k个数之和表示n:
开始计算
- 方法中维护了四个变量:rest(剩余数字个数),target(当前和还缺多少),sum(题目需要求的总和,也可使用全局变量记录,currentSum(当前列表中已有元素的和,也可使用sum - target计算)
- 首先,当剩余个数为1,但target仍大于9(rest == 1 && target > 9),即还剩一个元素的位置,但却需要一个大于9的数来满足题意,无法达到目标,因此直接return,放弃此情况。
- 其次,如果剩余个数为1,并且加上当前target后能够达到sum值,那么此时的target就是我们需要的最后一个元素,将其加入答案res,加入之后移除末尾元素,以便进行后续运算。
- 剩余部分请看代码中的注释。
代码
1 | class Solution { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 MomentNi!
评论