public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> res = new ArrayList<List<Integer>>();
f(nums, 0, res);
return res;
}
public void f(int[] nums, int i, List<List<Integer>> res){
if(i==nums.length){
List<Integer> cur = new ArrayList<>();
for(int num : nums){
cur.add(num);
}
res.add(cur);
}else{
for(int j=i; j<nums.length; j++){
swap(i,j,nums);
f(nums, i+1, res);
swap(i,j,nums);//必须换回来,否则出错
}
}
}
public void swap(int i, int j,int[] nums){
int temp = nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
78.子集
class Solution {
List<List<Integer>> ans = new ArrayList<List<Integer>>();
List<Integer> path = new ArrayList<>();
public List<List<Integer>> subsets(int[] nums) {
dfs(0,nums);
return ans;
}
/**
从输入的角度来看,可以分为 选i 元素与 不选 两种
*/
public void dfs(int cur, int[] nums){
// 边界条件
if(cur==nums.length){
ans.add(new ArrayList<Integer>(path));
return;
}
// 选i元素
path.add(nums[cur]);
dfs(cur+1, nums);
// 恢复现场
path.remove(path.size()-1);
// 不选i
dfs(cur+1,nums);
}
}