zoukankan      html  css  js  c++  java
  • [LintCode] 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], and [2,1,1].

    class Solution {
    public:
        vector<vector<int>> permuteUnique(vector<int>& nums) {
            vector<vector<int>> paths;
            if (nums.empty()) {
                return paths;
            }
            
            vector<int> index;
            vector<int> path;
            permuteUniqueHelper(nums, index, path, paths);
            return paths;
            
        }
        
    private:
        void permuteUniqueHelper(const vector<int> &nums,
                                 vector<int> &index,
                                 vector<int> &path,
                                 vector<vector<int>> &paths) {
            if (path.size() == nums.size()) {
                paths.push_back(path);
                return;
            }
            
            // 保证相同的数不在同一位置出现两次以上
            unordered_set<int> hashset;
            for (int ix = 0; ix < nums.size(); ix++) {
                if (find(index.begin(), index.end(), ix) == index.end() && hashset.count(nums[ix]) == 0) {
                    hashset.insert(nums[ix]);
                    
                    index.push_back(ix);
                    path.push_back(nums[ix]);
                    permuteUniqueHelper(nums, index, path, paths);
                    index.pop_back();
                    path.pop_back();
                }
            } 
        }
    };
    能否对空间复杂度做进一步的优化?
    class Solution {
    public:
        /**
         * @param nums: A list of integers.
         * @return: A list of unique permutations.
         */
        vector<vector<int> > permuteUnique(vector<int> &nums) {
            // write your code here
            vector<vector<int>> paths;
            if (nums.empty()) {
                return paths;
            }
            
            sort(nums.begin(), nums.end());
            bool *visited = new bool[nums.size()]();
            vector<int> path;
            permuteUniqueHelper(nums, visited, path, paths);
            return paths;
        }
        
    private:
        void permuteUniqueHelper(const vector<int> &nums,
                                 bool visited[],
                                 vector<int> &path,
                                 vector<vector<int>> &paths) {
            if (path.size() == nums.size()) {
                paths.push_back(path);
                return;
            } 
            
            for (int ix = 0; ix < nums.size(); ix++) {
                if (visited[ix] == true || ix > 0 && nums[ix - 1] == nums[ix] && visited[ix - 1] == false) {
                    continue;    
                }
                
                visited[ix] = true;
                path.push_back(nums[ix]);
                permuteUniqueHelper(nums, visited, path, paths);
                visited[ix] = false;
                path.pop_back();
            }
        }
    };
  • 相关阅读:
    apache开源项目 -- Wicket
    读书笔记--《机器人时代》
    apache开源项目--dbutils
    apache开源项目--mina
    apache开源项目--OpenMeetings
    apache开源项目--lume
    apache开源项目--Sirona
    shared_ptr的简单实现
    高并发网络编程之epoll详解
    最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和
  • 原文地址:https://www.cnblogs.com/jianxinzhou/p/4525222.html
Copyright © 2011-2022 走看看