• 47. Permutations II


    Given a collection of numbers that might contain duplicates, return all possible unique permutations.

    For example,
    [1,1,2] have the following unique permutations:

    [
      [1,1,2],
      [1,2,1],
      [2,1,1]
    ]
    

    分析

    因为可能出现重复的元素
    1. 对数组进行排序,ascending的顺序
    2. 对begin位置的元素交换的时候,保证交换的一定是不同的元素即可

    使用 引用nums并且回溯之前再次swap的方法不能AC,很奇怪?不能AC的代码如下:
    测试[1,1,2,2]数据,代码是ok的,但是测试[0,0,1,1,2,2]代码,虽然值相同,但是下面的代码并不是都能按照从小到大的顺序生成全排列。
    下面的代码答案最后几个是:[..[2,2,1,0,0,1],[2,2,0,1,1,0],[2,2,0,1,0,1],[2,2,0,0,1,1]]
    但是标准答案是:       [..[2,2,0,1,1,0],[2,2,1,0,0,1],[2,2,1,0,1,0],[2,2,1,1,0,0]]
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    class Solution {
    public:
        vector<vector<int>> permuteUnique(vector<int>& nums) {
            vector<vector<int>> results;
            sort(nums.begin(), nums.end());
            helper(results, 0, nums);
            return results;
        }
         
        void helper(vector<vector<int>> & results,int begin, vector<int> & nums){
            if(begin == nums.size() - 1 ){
                results.push_back(nums);
                return;
            }
             
            for(int i = begin; i < nums.size(); ++i){
                if(i!= begin && (nums[begin] == nums[i] || nums[i] == nums[i - 1])) continue;
                swap(nums[begin], nums[i]);
                helper(results, begin + 1, nums);
                swap(nums[begin], nums[i]);
            }
        }
    };

    而使用传值的方式去DFS,则可以AC,代码如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    class Solution {
    public:
        vector<vector<int>> permuteUnique(vector<int>& nums) {
            vector<vector<int>> results;
            sort(nums.begin(), nums.end());
            helper(results, 0, nums);
            return results;
        }
         
        void helper(vector<vector<int>> & results,int begin, vector<int> nums){
            if(begin == nums.size() - 1 ){
                results.push_back(nums);
                return;
            }
             
            for(int i = begin; i < nums.size(); ++i){
                if(i!= begin && nums[begin] == nums[i]) continue;
                swap(nums[begin], nums[i]);
                helper(results, begin + 1, nums);
                 
            }
        }
    };

    后来一步步分析,关键还就在于 这里的代码,swap之后,DFS之后,并没有再次进行swap还原。
    例如:
    假设DFS过程已经进行到下面:


     




  • 相关阅读:
    2. 商城项目完整购物链路 lq
    如何看源码? lq
    事务的了解 lq
    1. 商城业务架构分析 lq
    并发的基础知识 lq
    mysql 索引 lq
    mysqlinnodb了解 lq
    IE6.0、IE7.0 与FireFox CSS兼容的解决方法
    CSS:html/css教程:背景图片的定位问题详解
    IE6 BUG
  • 原文地址:https://www.cnblogs.com/zhxshseu/p/a5b6798ef83004e6acb7d0932fee7950.html
Copyright © 2020-2023  润新知