注意:组合中的数字是无序的,而排列中的数字是有序的
组合问题
//组合问题 从n中选取k个数的全部组合
class Solution {
List<List<Integer>> result = new ArrayList<>();
LinkedList<Integer> path = new LinkedList<>();
public List<List<Integer>> combine(int n, int k) {
backtracking(n, k, 1);
return result;
}
public void backtracking(int n, int k,int startIndex) {
if(path.size() == k) {
result.add(new ArrayList<>(path));
return;
}
for (int i = startIndex; i <= n ; i++) {
path.add(i);
backtracking(n, k,i+1);
path.removeLast();
}
}
}
排列问题的两种方法#1 抓取法:可抓取全部排列
//获取n个数目的全排列
class Solution {
List<List<Integer>> result = new ArrayList<>();
LinkedList<Integer> path = new LinkedList<>();
public List<List<Integer>> permute(int[] nums) {
boolean[] used = new boolean[nums.length];
backtracking(nums,used);
return result;
}
public void backtracking(int[] nums,boolean[] used){
if(path.size() == nums.length){
result.add(new ArrayList<>(path));
return;
}
for (int i = 0; i < nums.length; i++) {
if(used[i]){
continue;
}
path.add(nums[i]);
used[i] = true;
backtracking(nums,used);
used[i] = false;
path.removeLast();
}
}
}
#2交换法:在原数组中进行交换并进行相关判断,可节省空间。
static nums[];//待排排列判断数组,可根据题意自行生成
static int ans = 0;
private static void backTracking(int index){
if(index==nums.length && isValid()) {
//递归出口 isVaild()通常为每完成一次排序时对数组是否符合题目要求的检测函数
ans++;
return;
}
for (int i = index; i < nums.length; i++) {
swap(i,index);
backTracking(index+1);
swap(i,index);
}
}
private static void swap(int i, int index) {
int temp = nums[i];
nums[i] = nums[index];
nums[index] = temp;
}