给定两个整数 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 <= n <= 20
1 <= k <= n
回溯。
回溯最重要的,一个是终止条件,一个是还原。
class Solution { public List<List<Integer>> combine(int n, int k) { List<List<Integer>> res = new ArrayList<>(); List<Integer> list = new ArrayList<>(); dfs(list, n, k, res); return res; } private void dfs(List<Integer> list, int num, int k, List<List<Integer>> res) { if (list.size() == k) { res.add(new ArrayList<>(list)); return; } for (int i = num; i > 0; i --) { list.add(i); dfs(list, i - 1, k, res); list.remove(list.size() - 1); } } }
优化优化,可以想到当剩余可以放的数字加上已有长度已经无法满足大于等于 k 后就可以退出递归。
class Solution { public List<List<Integer>> combine(int n, int k) { List<List<Integer>> res = new ArrayList<>(); List<Integer> list = new ArrayList<>(); dfs(list, n, k, res); return res; } private void dfs(List<Integer> list, int num, int k, List<List<Integer>> res) { if (list.size() + num < k) { return; } if (list.size() == k) { res.add(new ArrayList<>(list)); return; } for (int i = num; i > 0; i --) { list.add(i); dfs(list, i - 1, k, res); list.remove(list.size() - 1); } } }
标签:---,77,int,res,list,dfs,力扣,new,List From: https://www.cnblogs.com/allWu/p/17590163.html