zoukankan      html  css  js  c++  java
  • [LintCode] Permutations

    http://www.lintcode.com/en/problem/permutations/#

    Given a list of numbers, return all possible permutations.

    Example

    For nums = [1,2,3], the permutations are:

    [
      [1,2,3],
      [1,3,2],
      [2,1,3],
      [2,3,1],
      [3,1,2],
      [3,2,1]
    ]

    求全排列,可以使用DFS来解决,来看代码:

    class Solution {
    public:
        /**
         * @param nums: A list of integers.
         * @return: A list of permutations.
         */
        vector<vector<int> > permute(vector<int> nums) {
            // write your code here
            vector<vector<int>> paths;
            if (nums.empty()) {
                return paths;
            }
            
            vector<int> index;
            vector<int> path;
            permuteHelper(nums, index, path, paths);
            return paths;
            
        }
        
    private:
        void permuteHelper(const vector<int> &nums,
                           vector<int> &index,    
                           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 (find(index.begin(), index.end(), ix) == index.end()) {
                    index.push_back(ix);
                    path.push_back(nums[ix]);
                    permuteHelper(nums, index, path, paths);
                    index.pop_back();
                    path.pop_back();
                }
            }                   
        }
    };

    实际上,观察某数是否已经访问过,不必使用一个vector,因为在vector中看一个数有没有访问过,需要o(n)的时间复杂度,此处完全可以用一个hashset来代替,看以下代码:

    class Solution {
    public:
        /**
         * @param nums: A list of integers.
         * @return: A list of permutations.
         */
        vector<vector<int> > permute(vector<int> nums) {
            // write your code here
            vector<vector<int>> paths;
            if (nums.empty()) {
                return paths;
            }
            
            unordered_set<int> index;
            vector<int> path;
            permuteHelper(nums, index, path, paths);
            return paths;
        }
        
    private:
        void permuteHelper(const vector<int> &nums,
                     unordered_set<int> &index,
                     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 (index.count(ix) == 0) {
                    index.insert(ix);
                    path.push_back(nums[ix]);
                    permuteHelper(nums, index, path, paths);
                    index.erase(ix);
                    path.pop_back();
                }
            }
        }
    };

    能不能更进一步?这边完全可以使用一个数组来模拟hashset,来看代码:

    class Solution {
    public:
        /**
         * @param nums: A list of integers.
         * @return: A list of permutations.
         */
        vector<vector<int> > permute(vector<int> nums) {
            // write your code here
            vector<vector<int>> paths;
            if (nums.empty()) {
                return paths;
            }
            
            bool *visited = new bool[nums.size()]();
            vector<int> path;
            permuteHelper(nums, visited, path, paths);
            return paths;
        }
        
    private:
        void permuteHelper(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] == false) {
                    visited[ix] = true;
                    path.push_back(nums[ix]);
                    permuteHelper(nums, visited, path, paths);
                    visited[ix] = false;
                    path.pop_back();
                }
            }
        }
    };

     

  • 相关阅读:
    WEB上传大文件
    Java+超大文件上传
    php+文件夹上传
    php上传视频大文件
    每一个程序猿需掌握的20个代码命名小贴士
    Mysql整数运算NULL值处理注意点
    拓展欧几里得模板
    bzoj 1088 简单dfs
    决策树
    进程-IPC 管道 (一)
  • 原文地址:https://www.cnblogs.com/jianxinzhou/p/4523416.html
Copyright © 2011-2022 走看看