• [刷题] 46 Permutations


    要求

    • 整型数组,每个元素不相同,返回元素所有排列的可能

    示例

    • [1,2,3]
    • [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]

    思路

    • 树形问题,回溯法

    实现

    • permute():生成所有排列
    • generatePermutation():生成一个排列
    • nums:向量,输入
    • res:二维向量,保存生成的排列
    • p:向量,找到的一个排列
    • used:向量,记录nums中的第i个元素是否被使用过
    • 32-33:回溯,将p和used恢复原状,进行下一轮循环
     1 #include <vector>
     2 #include <iostream>
     3 #include <string>
     4 
     5 using namespace std; 
     6 
     7 class Solution {
     8     
     9 private:
    10     vector<vector<int>> res;
    11     vector<bool> used;
    12     
    13     // 生成nums中元素的排列,index--正在处理第几个元素,p--找到的一个排列 
    14     // p中保存一个有index个元素的排列
    15     // 向p末尾添加第index+1个元素,获得一个有index+1个元素的排列 
    16     void generatePermutation( const vector<int>& nums, int index, vector<int>& p ){
    17         
    18         if( index == nums.size() ){
    19             cout<<"p = "<< p[0] << p[1] << p[2] << endl;
    20             res.push_back(p);
    21             return;
    22         }
    23         
    24         for( int i = 0 ; i < nums.size(); i ++ )
    25             if( !used[i] ){
    26                 // 将nums[i]添加在p中
    27                 p.push_back( nums[i] );
    28                 used[i] = true;
    29                 cout<<"nums["<<i<<"] = "<<nums[i]<<endl;
    30                 generatePermutation(nums, index+1, p); 
    31                 // 状态回溯 
    32                 p.pop_back();
    33                 used[i] = false;
    34             }
    35         return;
    36     }
    37 
    38 public:
    39     vector<vector<int>> permute(vector<int>& nums) {
    40         
    41         res.clear();
    42         if( nums.size() == 0 )
    43             return res;
    44         
    45         used = vector<bool>(nums.size(), false);
    46         vector<int> p;
    47         generatePermutation( nums, 0, p);
    48         
    49         return res;
    50     }
    51 };
    52 
    53 int main(){
    54     vector<int> v{1,2,3};
    55     vector<vector<int>> res = Solution().permute(v);
    56     
    57     return 0;
    58 }
    View Code

        

    相关

    • 47 Permutation II
  • 相关阅读:
    大话设计模式笔记(二十)の命令模式
    大话设计模式笔记(十九)の桥接模式
    大话设计模式笔记(十八)の单例模式
    大话设计模式笔记(十七)の迭代器模式
    反射的使用及其使用场景
    linq的简单使用
    XML的简单使用
    log4net的简单使用
    token
    axios在vue中的简单封装及应用
  • 原文地址:https://www.cnblogs.com/cxc1357/p/12702849.html
Copyright © 2020-2023  润新知