zoukankan      html  css  js  c++  java
  • [leetcode]46. 全排列

    46. 全排列

    排列,用回溯法

    class Solution {
    public:
        vector<vector<int>> permute(vector<int>& nums) {
            vector<vector<int>> permutation;
            vector<bool> visited(nums.size(), false);
            vector<int> vec;
            
            if(nums.size() > 0)
                backtrack(permutation, nums, visited, vec, 0);
            return permutation;
        }
        
        void backtrack(vector<vector<int>>& permutation, const vector<int>& nums, vector<bool>& visited, vector<int>& vec, int start) {
            if(nums.size() == start) {
                permutation.emplace_back(vec);
                return;
            }
            for(int i = 0; i < nums.size(); ++i) {
                if(!visited[i]) {
                    visited[i] = true;
                    vec.push_back(nums[i]);
                    backtrack(permutation, nums, visited, vec, start+1);
                    visited[i] = false;
                    vec.pop_back();
                }
            }
        }
    };
    

    官方题解没有采用visited数组去判断是否已经排序,采用的是将nums数组分为左右2部分。左边的部分已经排过,右边待排序。每次通过从右边选一个数到左边,来进行回溯

    class Solution {
    public:
        void backtrack(vector<vector<int>>& res, vector<int>& output, int first, int len){
            // 所有数都填完了
            if (first == len) {
                res.emplace_back(output);
                return;
            }
            for (int i = first; i < len; ++i) {
                // 动态维护数组
                swap(output[i], output[first]);
                // 继续递归填下一个数
                backtrack(res, output, first + 1, len);
                // 撤销操作
                swap(output[i], output[first]);
            }
        }
        vector<vector<int>> permute(vector<int>& nums) {
            vector<vector<int> > res;
            backtrack(res, nums, 0, (int)nums.size());
            return res;
        }
    };
    
  • 相关阅读:
    Qt Creator pro 文件 导入vs2013碰到的问题
    扫描助手技术支持
    测试下载
    pod安装(可安装任意版本)和卸载 (转载做记录自留备用)
    阿拉德下载
    Mac 上传项目到码云
    iOS中Realm数据库的基本用法
    集成微信支付流程整理
    tableViewCell左划显示多个按钮(系统原生)
    快速排序法从小到大排序
  • 原文地址:https://www.cnblogs.com/pusidun/p/13629913.html
Copyright © 2011-2022 走看看