https://leetcode.cn/problems/combinations/description/?envType=study-plan-v2&envId=top-interview-150
思路:看完题目还是要求所有排列的情况(看样例好像是只要升序的情况),我们自然还是使用dfs,我们先把数字范围的数字处理成数组类型方便后续处理,再对这个数组dfs
class Solution {
public List<List<Integer>> combine(int n, int k) {
// 处理好待排序的数字
int[] digits = new int[n];
for (int i = 0; i < digits.length; i++) {
digits[i] = i + 1;
}
boolean[] signed = new boolean[digits.length];// 记录数字是否被使用
List<List<Integer>> res = new ArrayList<>();
dfs(digits, signed, res, new ArrayList<>(), k, -1);
return res;
}
/**
* 深度优先搜索
* @param digits 待排序的数字
* @param signed 记录数字是否被使用
* @param res 结果集
* @param list 当前排列
* @param k 目标排列的长度
* @param index 上一个数的下标,用来保证升序
*
*/
public void dfs(int[] digits, boolean[] signed, List<List<Integer>> res, List<Integer> list, int k, int index) {
if(list.size() == k) {
// 注意这里要new一个新的list不然后续回溯的时候会影响res中的
res.add(new ArrayList<>(list));
return;
}
for(int i = 0; i < digits.length; i++) {
// 保证升序
if(i > index && !signed[i]) {
signed[i] = true;
list.add(digits[i]);
dfs(digits, signed, res, list, k, i);
list.remove(list.size() - 1);
signed[i] = false;
}
}
}
public static void main(String[] args) {
System.out.println(new Solution().combine(4, 2));
}
}
588

被折叠的 条评论
为什么被折叠?



