一、组合问题
1. 组合
给定两个整数 n
和 k
,返回范围 [1, n]
中所有可能的 k
个数的组合。
你可以按 任何顺序 返回答案。
输入:n = 4, k = 2 输出: [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4]]
class Solution {
List<List<Integer>> res = new ArrayList<>();
List<Integer> path = new ArrayList<>();
public List<List<Integer>> combine(int n, int k) {
backTrack(n, k, 1);
return res;
}
public void backTrack(int n, int k, int index){
if (path.size() == k){
res.add(new ArrayList<>(path));
return;
}
for (int i = index; i <= n; i++){
path.add(i);
backTrack(n, k, i + 1);
path.remove(path.size() - 1);
}
}
}
2. 组合总和 III
找出所有相加之和为 n
的 k
个数的组合,且满足下列条件:
- 只使用数字1到9
- 每个数字 最多使用一次
返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。
输入: k = 3, n = 9 输出: [[1,2,6], [1,3,5], [2,3,4]]
class Solution {
List<List<Integer>> result = new ArrayList<>();
List<Integer> path = new ArrayList<>();
public List<List<Integer>> combinationSum3(int k, int n) {
backTracking(n, k, 1, 0);
return result;
}
private void backTracking(int targetSum, int k, int index, int sum) {
if (sum > targetSum) {
return;
}
if (path.size() == k) {
if (sum == targetSum) {
result.add(new ArrayList<>(path));
};
return;
}
for (int i = index; i <= 9; i++) {
path.add(i);
sum += i;
backTracking(targetSum, k, i + 1, sum);
path.remove(path.size() - 1);
sum -= i;
}
}
}
二、排列问题
1. 全排列
给定一个不含重复数字的数组 nums
,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
class Solution {
List<List<Integer>> res = new ArrayList();
List<Integer> path = new ArrayList();
boolean[] visited;
public List<List<Integer>> permute(int[] nums) {
visited = new boolean[nums.length];
backTrack(nums, 0);
return res;
}
public void backTrack(int[] nums, int index) {
if (index == nums.length) {
res.add(new ArrayList(path));
return;
}
for (int i = 0; i < nums.length; i++) {
if (visited[i]) {
continue;
}
visited[i] = true;
path.add(nums[i]);
backTrack(nums, index + 1);
visited[i] = false;
path.remove(path.size() - 1);
}
}
}
2. 全排列 II
给定一个可包含重复数字的序列 nums
,按任意顺序 返回所有不重复的全排列。
输入:nums = [1,1,2] 输出: [[1,1,2],[1,2,1],[2,1,1]]
class Solution {
List<List<Integer>> res = new ArrayList<List<Integer>>();
List<Integer> path = new ArrayList<Integer>();
boolean[] visited;
public List<List<Integer>> permuteUnique(int[] nums) {
Arrays.sort(nums);
visited = new boolean[nums.length];
backtrack(nums, 0);
return res;
}
public void backtrack(int[] nums, int index) {
if (index == nums.length) {
res.add(new ArrayList(path));
return;
}
for (int i = 0; i < nums.length; i++) {
if (visited[i] || (i > 0 && nums[i] == nums[i - 1] && !visited[i - 1])) {
continue;
}
visited[i] = true;
path.add(nums[i]);
backtrack(nums, index + 1);
visited[i] = false;
path.remove(path.size() - 1);
}
}
}