排列问题

69 阅读1分钟

排列问题 需要用到used/vis来做标记。

46. 全排列 - 力扣(LeetCode)

思想

组合与排列的区别,回溯算法求解的时候,有何不同?| LeetCode:46.全排列_哔哩哔哩_bilibili image.png

class Solution {
public: 
  vector<int>path;
  vector<vector<int>>result;

  void dfs(vector<int>& nums,vector<bool>&used)
  {
    //递归结束条件
    if(path.size()==nums.size())result.push_back(path);

    //单层搜索逻辑
    for(int i=0;i<nums.size();i++)
    {
       if(used[i]==true)continue;//path已经收录过了,就直接跳过
       used[i]=true;//把当前元素设为已经收录过了
       path.push_back(nums[i]);//收录路径上果实
       dfs(nums,used);
       path.pop_back();
       used[i]=false;
    }
  }

    vector<vector<int>> permute(vector<int>& nums) {
     result.clear();
     path.clear();
    vector<bool>used(nums.size(),false);
    dfs(nums,used);
    return result;
    }
};

842. 排列数字 - AcWing题库

#include<iostream>  
#include<vector>  
using namespace std;  
  
vector<int> path;  
vector<vector<int>> result;  
  
void dfs(int nums, vector<bool>& used) {  
    if (path.size() == nums) {  
        result.push_back(path);  
        return;  
    }  
  
    for (int i = 1; i <=nums; i++) {  
        if (!used[i]) {  
            used[i] = true;  
            path.push_back(i);  
            dfs(nums, used);  
            path.pop_back();  
            used[i] = false;  
        }  
    }  
}  
  
int main() {  
    int nums;  
    cin >> nums;  
    result.clear();  
    path.clear();  
    vector<bool> used(nums, false);  
    dfs(nums, used);  
      
    // 输出结果    
    for (const auto& vec : result) {    
        for (int num : vec) {    
            cout << num << " ";    
        }    
        cout << endl;    
    }    
    return 0;  
}