zoukankan      html  css  js  c++  java
  • LeetCode Permutations II

    class Solution {
        public:
            vector<vector<int> > permuteUnique(vector<int> &num) {
                vector<vector<int> > result;
                if (num.size() < 1) return result;
                vector<int> path;
                dfs(num, 0, path, result);
            }
    
            void dfs(vector<int>& dict, int pos, vector<int>& path, vector<vector<int> > &result) {
                int len = dict.size();
                if (pos >= len) {
                    result.push_back(path);
                    return;
                }
                unordered_set<int> uniques;
                for (int i=pos; i<len; i++) {
                    if (i != pos && uniques.count(dict[i]) > 0) continue;
                    uniques.insert(dict[i]);
                    path.push_back(dict[i]);
                    
                    int tmp = dict[i];
                    dict[i] = dict[pos];
                    dict[pos] = tmp;
                    
                    dfs(dict, pos + 1, path, result);
                    path.pop_back();
    
                    tmp = dict[i];
                    dict[i] = dict[pos];
                    dict[pos] = tmp;
                }
            }
    };

     也可以用next_permutation

    class Solution {
        public:
        vector<vector<int> > permuteUnique(vector<int> &num) {
                vector<vector<int> > res;
                sort(num.begin(), num.end());
                do {
                    res.push_back(num);
                } while (next_permutation(num.begin(), num.end()));
                return res;
            }
            
    };

    写一个不用hash表的

    class Solution {
    private:
        vector<vector<int>> res;
    
    public:
        vector<vector<int>> permuteUnique(vector<int>& nums) {
            res.clear();
            sort(nums.begin(), nums.end());
            
            int len = nums.size();
    
            vector<int> sub;
            vector<bool> used(len);
            
            dfs(nums, used, sub);
            
            return res;
        }
        
        void dfs(vector<int>& nums, vector<bool>& used, vector<int>& sub) {
            int len = nums.size();
            
            if (sub.size() >= len) {
                res.push_back(sub);
                return;
            }
            
            for (int i=0; i<len; i++) {
                if (used[i] || (i>0 && !used[i-1] && nums[i] == nums[i-1])) {
                    continue;
                }
                sub.push_back(nums[i]);
                used[i] = true;
                dfs(nums, used, sub);
                used[i] = false;
                sub.pop_back();
            }
        } 
    };

    还是这种方法比较简洁:

    class Solution {
    private:
        vector<vector<int>> res;
    public:
        vector<vector<int>> permuteUnique(vector<int>& nums) {
            res.clear();
            dfs(nums, 0);
            return res;
        }
        
        void dfs(vector<int>& nums, int pos) {
            int len = nums.size();
            if (pos >= len) {
                res.push_back(nums);
                return;
            }
            
            unordered_set<int> st;
            for (int i=pos; i<len; i++) {
                if (st.count(nums[i]) > 0) {
                    continue;
                }
                st.insert(nums[i]);
                swap(nums[i], nums[pos]);
                dfs(nums, pos + 1);
                swap(nums[i], nums[pos]);
            }
        }
    };
  • 相关阅读:
    监听手机晃动(摇一摇)SensorEventListener
    adb logcat 命令行用法
    设计模式:观察者模式
    设计模式学习笔记-观察者模式
    Android中Parcelable序列化总结
    2048 Puzzle游戏攻略
    projecteuler----&gt;problem=14----Longest Collatz sequence
    桥模式设计模式进入Bridge
    SessionA和pplication网上聊天室的网络范例
    [ACM] hdu 5045 Contest (减少国家Dp)
  • 原文地址:https://www.cnblogs.com/lailailai/p/3755722.html
Copyright © 2011-2022 走看看