排列数
排列数:从N个目标中选出M个进行排列(即使元素相同,其顺序不同,排列也不同)
leetcode46 全排列
class Solution {
public:
vector<vector<int>>ans;
vector<vector<int>> permute(vector<int>& nums) {
dfs(nums,0);
return ans;
}
//处理下标为k的数
void dfs(vector<int>& nums,int k){
if(k==nums.size()){
ans.push_back(nums);
return;
}
for(int i=k;i<nums.size();i++){
swap(nums[i],nums[k]);
dfs(nums,k+1);
swap(nums[i],nums[k]);
}
}
};
若存在重复元素
void permutation(vector<int>&nums,int k){
//在下一轮进行判断
if(k==nums.size()){
ans.push_back(nums);
return;
}
set<int>record;
for(int i=k;i<nums.size();i++){
int target=nums[i];
if(record.find(target)!=record.end()){
continue;
}
record.insert(target);
swap(nums[i],nums[k]);
permutation(nums,k+1);
swap(nums[i],nums[k]);
}
组合数
组合数:从N个目标中选出M个进行组合(顺序不影响结果)
leetcode77 组合
class Solution {
private List<List<Integer>>ans=new ArrayList<>();
private List<Integer>tmp=new ArrayList<>();
private int n,k;
public List<List<Integer>> combine(int n, int k) {
this.n=n;
this.k=k;
dfs(1);
return ans;
}
//从下标t~n中选一个数
void dfs(int t){
if(tmp.size()==k){
ans.add(new ArrayList<Integer>(tmp));
return;
}
if(t==n+1){
return;
}
for(int i=t;i<=n;i++){
tmp.add(i);
dfs(i+1);
tmp.remove(tmp.size()-1);
}
}
}