【Leetcode】[46] Permutations

Given a collection of distinct integers, return all possible permutations.

Example:

Input: [1,2,3]
Output:
[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]

题目:给定不同的整数序列,输出所有可能的序列。这个题目没说给出重复的整数。

解题思路:使用dfs,这与我们上面解过的subset题目类似。不过这里是得到集合的全排列,dfs结束条件要是temp.size==nums.size。而且for循环不能从上次k往下面循环,而是每次递归要从0开始循环。为了保证每个数据加入一次,建立一个nums.size大小的数组作为标志数组。

代码:

#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
void dfs(vector<vector<int> >& numList,vector<int>& temp,vector<int>& nums,bool visit[]){
    if(temp.size()==nums.size()){ //临时存储数组等于给定数组长度时,添加到numList中
        numList.push_back(temp);
        return;
    }else{
        for(int i=0;i<nums.size();i++){  //每次递归for循环从0开始
            if(visit[i]==false){  //临时数组是否添加数字的标志位
                temp.push_back(nums[i]);
                visit[i] = true;
                dfs(numList,temp,nums,visit);
                temp.pop_back();   //剔除return的最后一个数据
                visit[i] = false;   //同时标志位置false
            }
        }
    }
}
int main()
{
    vector<int> nums;
    vector<vector<int> > numList;
    int s;
    while(cin>>s){
        nums.push_back(s);
    }
    sort(nums.begin(),nums.end());
    vector<int> temp;
    int n= nums.size();
    bool visit[n];
    for(int i=0;i<n;i++){
        visit[i] = false;
    }
    dfs(numList,temp,nums,visit);
    for(int i=0;i<numList.size();i++){
        for(int j=0;j<numList[i].size();j++){
            cout << numList[i][j]<<" ";
        }
        cout << endl;
    }
    return 0;
}

对于Permutations II 的题目,输入存在相同数字的序列。在pop数据后,直接到和上次添加数据不同的数据。

代码::

#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
void dfs(vector<vector<int> >& numList,vector<int>& temp,vector<int>& nums,bool visit[]){
    if(temp.size()==nums.size()){
        numList.push_back(temp);
        return;
    }else{
        for(int i=0;i<nums.size();i++){
            if(visit[i]==false){
                temp.push_back(nums[i]);
                visit[i] = true;
                dfs(numList,temp,nums,visit);
                temp.pop_back();
                visit[i] = false;
                while(i<nums.size()-1 && nums[i]==nums[i+1])
                    i++;
            }
        }
    }
}
int main()
{
    vector<int> nums;
    vector<vector<int> > numList;
    int s;
    while(cin>>s){
        nums.push_back(s);
    }
    sort(nums.begin(),nums.end());
    vector<int> temp;
    int n= nums.size();
    bool visit[n];
    for(int i=0;i<n;i++){
        visit[i] = false;
    }
    dfs(numList,temp,nums,visit);
    for(int i=0;i<numList.size();i++){
        for(int j=0;j<numList[i].size();j++){
            cout << numList[i][j]<<" ";
        }
        cout << endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/csdn_chuxuezhe/article/details/81544078