Question
Given two integers n and k, return all possible combinations of k numbers out of 1 … n.
给出两个整数n和k,返回所有可能的由K个1…n中的元素的组合
Example
If n = 4 and k = 2, a solution is:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
Solution
回溯解。因为是从1…n中取k个元素组合,所有我们只需要在穷举的过程中,仅当组合的个数为K个时候添加到结果集,因为给出的1…n不会重复,所以不需要担心在穷举的时候出现重复。
public class Solution { public List<List<Integer>> combine(int n, int k) { int[] nums = new int[n]; for(int i = 0; i < n; i++){ nums[i] = i + 1; } List<List<Integer>> res = new ArrayList<>(); backtracking(nums, 0, k, res, new ArrayList<>()); return res; } public void backtracking(int[] nums, int start, int k, List<List<Integer>> res, List<Integer> temp){ // 仅当当前链表中元素有K个的时候才将它添加结果集 if(temp.size() == k){ res.add(new ArrayList<>(temp)); return; } for(int i = start;i< nums.length; i++){ temp.add(nums[i]); backtracking(nums, i + 1, k, res, temp); temp.remove(temp.size() - 1); } } }