zoukankan      html  css  js  c++  java
  • 46. 47. Permutations

    求全排列。

    1. 无重复元素

    Given a collection of distinct numbers, return all possible permutations.

    For example,
    [1,2,3] have the following permutations:
    [1,2,3][1,3,2][2,1,3][2,3,1][3,1,2], and [3,2,1].

    * The algroithm - Take each element in array to the first place.
    * For example:
    * 0) initalization
    * pos = 0
    * [1, 2, 3]
    * 1) take each element into the first place,
    * pos = 1
    * [1, 2, 3] ==> [2, 1, 3] , [3, 1, 2]
    * then we have total 3 answers
    * [1, 2, 3], [2, 1, 3] , [3, 1, 2]
    * 2) take each element into the "first place" -- pos
    * pos = 2
    * [1, 2, 3] ==> [1, 3, 2]
    * [2, 1, 3] ==> [2, 3, 1]
    * [3, 1, 2] ==> [3, 2, 1]
    * then we have total 6 answers
    * [1, 2, 3], [2, 1, 3] , [3, 1, 2], [1, 3, 2], [2, 3, 1], [3, 2, 1]
    * 3) pos = 3 which greater than length of array, return.

    vector<vector<int>> permute(vector<int>& nums) {
        int n = nums.size(), l, i, j, k;
        vector<vector<int>> ans;
        ans.push_back(nums);
        for(k = 0; k < n-1; k++)
        {
            l = ans.size();
            for(i = 0; i < l; i++)
            {
                for(j = 1; k+j < n; j++)
                {
                    vector<int> v = ans[i];
                    swap(v[k], v[k+j]);
                    ans.push_back(v);
                }
            }
        }
        return ans;
    }

    2. 有重复元素

    // To deal with the duplication number, we need do those modifications:
    // 1) sort the array [pos..n].
    // 2) skip the same number.

    vector<vector<int>> permuteUnique(vector<int>& nums) {
        int n = nums.size(), l, i, j, k;
        vector<vector<int>> ans;
        ans.push_back(nums);
        for(k = 0; k < n-1; k++)
        {
            l = ans.size();
            for(i = 0; i < l; i++)
            {
                sort(ans[i].begin()+k, ans[i].end());
                for(j = 1; k+j < n; j++)
                {
                    vector<int> v = ans[i];
                    if(v[k+j] == v[k+j-1])
                        continue;
                    swap(v[k], v[k+j]);
                    ans.push_back(v);
                }
            }
        }
        return ans;
    }
  • 相关阅读:
    CSRF小结
    代码注入小结
    文件上传漏洞小结
    解决Burpsuite_pro_v1.6破解版https证书导入问题
    Java HTTP 组件库选型看这篇就够了
    趣图:我正在演示一个功能,但没有达到预期效果
    阅读源码的利器——Intellij-IDEA-Replace-in-Path-使用技巧
    分享一些好用的 Chrome 插件!
    趣图:程序员发量的变化过程
    Spring循环依赖的三种方式
  • 原文地址:https://www.cnblogs.com/argenbarbie/p/5264267.html
Copyright © 2011-2022 走看看