蓝桥杯入门即劝退(二十六)组合问题(回溯算法)
-----持续更新Spring入门系列文章-----
如果你也喜欢Java和算法,欢迎订阅专栏共同学习交流!
你的点赞、关注、评论、是我创作的动力!
-------希望我的文章对你有所帮助--------
专栏:蓝桥杯系列
一、题目描述
给定两个整数 n
和 k
,返回范围 [1, n]
中所有可能的 k
个数的组合。
你可以按 任何顺序 返回答案。
示例 1:
输入:n = 4, k = 2 输出: [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ]
示例 2:
输入:n = 1, k = 1 输出:[[1]]
二、解题思路
1、本题的套路相对于从一堆数中,按一定个数选择不同组数据,当k值小时的确使用常规暴力方法可以完成,但是k值过大,我们则不可能写个几十层循环来完成吧?
2、因此采用回溯算法,即循环和递归结合的方法。其实本题类似于树形结构,循环负责横向遍历,递归则是纵向遍历!
三、代码实现
class Solution {LinkedList<Integer>path=new LinkedList<>();//保存子集List<List<Integer>> result=new ArrayList<>();//结果集public List<List<Integer>> combine(int n, int k) {combineHelper(n,k,1);return result;}public void combineHelper(int n,int k,int start){if (k==path.size()) {result.add(new ArrayList<>(path));//满足个数,加入结果集return;}for (int i=start;i<=n-(k- path.size())+1;i++){path.add(i);//加入子集combineHelper(n,k,i+1);path.removeLast();}}
}
发文不易,恳请大佬们高抬贵手!
点赞:随手点赞是种美德,是大佬们对于本人创作的认可!
评论:往来无白丁,是你我交流的的开始!
收藏:愿君多采撷,是大佬们对在下的赞赏!