Leetcode - Permutations I,II

Leetcode - 046 Permutationssegmentfault

全排列問題是回溯的典型例題:
1.可行解的組成形式是給定數組中的全部數的組合,故而大小上能夠做爲可行解斷定條件
2.每次須要在剩下可被選中的集合中選擇一個,建立mask數組數組

class Solution {
public:

    void dfs(vector<vector<int>> &vct, vector<int> &cur, vector<int>& nums,vector<int> & used)
    {
        if (cur.size() == nums.size())
        {
            vct.push_back(cur);
            return;
        }
        for (int i = 0; i < nums.size(); ++i)
        {
            if (used[i] == 0)
            {
                cur.push_back(nums[i]);
                used[i] = 1;
                dfs(vct, cur, nums, used);
                used[i] = 0;
                cur.pop_back();
            }
        }
    }

    vector<vector<int>> permute(vector<int>& nums) {
        vector<vector<int>> vct;
        int n = nums.size();
        if (n <= 0)
            return vct;
        vector<int> cur;
        vector<int> used(n, 0);
        dfs(vct, cur, nums, used);
        return vct;
    }
};

Leetcode - 047. Permutations IIcode

diff : 須要考慮val1 = val2 的狀況,須要sort將相同元素聚類,而後能夠參考前文 Leetcode - 040. Combination Sum II 去重的方法ip

class Solution {
public:

    void dfs(vector<vector<int>> &vct, vector<int> &cur, vector<int>& nums, vector<int> & used)
    {
        if (cur.size() == nums.size())
        {
            vct.push_back(cur);
            return;
        }
        for (int i = 0; i < nums.size(); ++i)
        {
            if (used[i] == 0)
            {
                int pre_index = i - 1;
                bool repeated = false;
                while (pre_index >= 0 && nums[pre_index] == nums[i])
                {
                    if (used[pre_index] == 0)
                    {
                        repeated = true;
                        break;
                    }
                    --pre_index;
                }
                if (repeated)
                    continue;
                cur.push_back(nums[i]);
                used[i] = 1;
                dfs(vct, cur, nums, used);
                used[i] = 0;
                cur.pop_back();
            }
        }
    }

    vector<vector<int>> permuteUnique(vector<int>& nums) {
        vector<vector<int>> vct;
        vector<int> cur;
        int n = nums.size();
        if (n <= 0)
            return vct;
        vector<int> used(n, 0);
        dfs(vct, cur, nums, used);
        return vct;
    }
};
相關文章
相關標籤/搜索