zoukankan      html  css  js  c++  java
  • 刷题——一道全排列的题目(Permutations)

    题目内容:

    思路其实很简单,那就是暴力交换顺序,直接迭代出所有可能。先在一个位置固定一个数字,然后对剩下的数字进行排列,用同样的方法对剩下的数字进行排列(因此要用到递归,不用也行,但是会复杂一点,这里主要是用递归的方式)。

    类似这个博客里面的做法:

    顺带一提,全排列在有n个不重复元素的情况下总共有n!情况。

    下面是元素为1, 2, 3时的例子:

    注意看最右侧,思路其实和上图是一致的,只是每次依次固定最右侧的元素。

    代码如下:

    class Solution {
    public:
        /*
         * @param nums: A list of integers.
         * @return: A list of permutations.
         */
        vector<vector<int>> permute(vector<int> &nums) {
            vector<vector<int>> res;
            int n = nums.size();
            
            if(n==0){
                res.push_back(vector<int>());
                return res;
            }
            
            helper(res, nums, n-1);
            return res;
        }
        void helper(vector<vector<int> > &res, vector<int> nums, int n){
            if(n == 0){
                // printV(nums);
                res.push_back(nums);
            }
            for(int i=0; i<=n; i++){
                swap(nums[i], nums[n]);
                helper(res, nums, n-1);
                swap(nums[i], nums[n]);
                // printV(nums);
            }
        }
        void printV(vector<int> &nums){
            for(int i=0; i<nums.size()-1; i++){
                cout<<nums[i]<<",";
            }
            cout<<nums[nums.size()-1]<<endl;
        }
    };
    
    本博客文章默认使用CC BY-SA 3.0协议。
  • 相关阅读:
    SDN第二次作业
    SDN第一次上机作业
    SDN第一次作业
    期末作业验收
    SDN第五次上机作业
    SDN第四次上机作业
    SDN第三次作业
    SDN第三次上机作业
    SDN第二次上机作业
    SDN第二次作业
  • 原文地址:https://www.cnblogs.com/yejianying/p/lintcode_permutations.html
Copyright © 2011-2022 走看看