leetcode 46. 全排列 及 47. 全排列 II

46. 全排列

问题描述

给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]

问题分析

代码

class Solution {
public:
    vector<vector<int>> permute(vector<int>& nums) {
        int n = nums.size();
        vector<vector<int>> ans;
        vector<int> path;
        vector<bool> flag(n,false);
        backtrack(ans,path,nums,n,0,flag);
        return ans;
    }
    void backtrack(vector<vector<int>> &ans,vector<int> &path,vector<int>& nums,int n,int fir,vector<bool> &flag)
    {
        if(fir == n)
        {
            ans.push_back(path);
            return;
        }
        for(int i = 0; i < n; i++)
        {
            if(!flag[i])
            {
                path.push_back(nums[i]);
                flag[i] = true;
                backtrack(ans,path,nums,n,fir+1,flag);
                path.pop_back();
                flag[i] = false;
            }
        }
    }
};

结果:

执行用时 :12 ms, 在所有 cpp 提交中击败了95.23%的用户
内存消耗 :9.3 MB, 在所有 cpp 提交中击败了63.04%的用户

47. 全排列 II

问题描述

给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2]
输出:
[
  [1,1,2],
  [1,2,1],
  [2,1,1]
]

问题分析

代码

class Solution {
public:
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        int n = nums.size();
        vector<vector<int>> ans;
        vector<int> path;
        vector<bool> flag(n,0);
        sort(nums.begin(),nums.end());
        backtrack(nums,flag,n,0,ans,path);
        return ans;

    }
    void backtrack(vector<int>& nums,vector<bool> &flag,int n,int fir,vector<vector<int>>&ans,vector<int> &path)
    {
        if(fir == n){
            ans.push_back(path);
            return;
        }
        for(int i = 0; i < n; i++)
        {
            if(flag[i] == 0){
                if(i > 0 && nums[i] == nums[i-1] && flag[i-1] == 1)continue;
                path.push_back(nums[i]);
                flag[i] = 1;
                backtrack(nums,flag,n,fir+1,ans,path);
                path.pop_back();
                flag[i] = 0;
            }
        }
    }
};

结果

执行用时 :16 ms, 在所有 C++ 提交中击败了79.11%的用户
内存消耗 :10.1 MB, 在所有 C++ 提交中击败了62.00%的用户
posted @ 2020-02-12 14:38  曲径通霄  阅读(93)  评论(0编辑  收藏  举报