77-组合
给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。
示例:
输入: n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/combinations
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
public List<List<Integer>> combine(int n, int k) {
List<List<Integer>> res = new ArrayList<>();
if(n < k) {
return res;
} else if(k == 0) {
List<Integer> zero = new ArrayList<>();
res.add(zero);
return res;
}
int[] nums = new int[n];
for(int i = 0; i < n; i++) {
nums[i] = i + 1;
}
return subsets(nums, k);
}
public List<List<Integer>> subsets(int[] nums, int k) {
List<List<Integer>> res = new ArrayList<>();
if(nums.length == 0 || nums.length < k) {
return res;
}
if(k == 1) {
for(int num : nums) {
List<Integer> single = new ArrayList<>();
single.add(num);
res.add(single);
}
return res;
}
if(nums.length == k) {
List<Integer> full = new ArrayList<>();
for(int num : nums) {
full.add(num);
}
res.add(full);
return res;
}
// 递归,减治法
res = subsets(Arrays.copyOfRange(nums, 0, nums.length - 1), k);
List<List<Integer>> temp = subsets(Arrays.copyOfRange(nums, 0, nums.length - 1), k - 1);
for(List<Integer> t : temp) {
t.add(nums[nums.length - 1]);
res.add(t);
}
return res;
}