• Leetcode 46. 全排列(中等) 回溯算法


    labuladong讲解

    46. 全排列(中等)

    题目:

    给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

    示例 1:

    输入:nums = [1,2,3]
    输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

    思路:

    使用回溯算法框架,遍历所有可能性,用used记录已经取走的数字

    class Solution {
    public:
        /* 主函数,输入一组不重复的数字,返回它们的全排列 */
        vector<vector<int>> permute(vector<int>& nums) {
            int n=nums.size();
            // 「路径」中的元素会被标记为 true,避免重复使用
            vector<bool> used(n);
            // 记录「路径」
            vector<int> path;
            dp(nums,used,path);
            return ret;
        }
        // 路径:记录在 path 中
        // 选择列表:nums 中不存在于 path 的那些元素(used[i] 为 false)
        // 结束条件:nums 中的元素全都在 path 中出现
        void dp(vector<int>& nums, vector<bool>& used, vector<int>& path){
            // 触发结束条件
            if(path.size()==nums.size()){
                ret.push_back(path);
                return;
            }
            for(int i=0;i<nums.size();++i){
                // 排除不合法的选择
                if(used[i]){
                    // nums[i] 已经在 track 中,跳过
                    continue;
                }
                // 做选择
                used[i]=true;
                path.push_back(nums[i]);
                // 进入下一层决策树
                dp(nums,used,path);
                // 取消选择
                path.pop_back();
                used[i]=false;
            }
        }
        vector<vector<int>> ret;
    };

    47. 全排列 II(中等)

    题目:

    给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
     
    思路:
    在之前的基础上添加了重复数字。要求返回不重复的排列。
    这里可以在之前代码基础上添加一个剪枝判断。
    即对nums排序后,如果nums[i]==nums[i-1]&&used[i-1]那么就直接跳过
     
    class Solution {
    public:
        vector<vector<int>> permuteUnique(vector<int>& nums) {
            int n=nums.size();
            vector<bool> used(n);
            vector<int> track;
            sort(nums.begin(),nums.end());
            backtrack(nums,used,track);
            return ret;
        }
        void backtrack(vector<int>& nums,vector<bool>& used,vector<int>& track){
            if(track.size()==nums.size()){
                ret.push_back(track);
                return;
            }
            for(int i=0;i<nums.size();++i){
                if(used[i]){
                    continue;
                }
                if(i>0&&nums[i]==nums[i-1]&&used[i-1]){
                    continue;
                }
                track.push_back(nums[i]);
                used[i]=true;
                backtrack(nums,used,track);
                used[i]=false;
                track.pop_back();
            }
        }
        vector<vector<int>> ret;
    };
  • 相关阅读:
    [Laravel] mac下通过 homestead 搭建环境 到运行项目
    Mac下Laravel的Homestead环境配置
    Window10 下安装 Laravel / Homestead 视频
    Windows 10下Laravel的开发环境安装及部署(Vagrant + Homestead)
    Apache 调用不同的 PHP 版本
    inux系统用户名和全名有什么区别
    oracle 学习day01
    rpm
    Linux下可以使用ps命令来查看Oracle相关的进程
    oracle 建用户
  • 原文地址:https://www.cnblogs.com/zl1991/p/15973980.html
Copyright © 2020-2023  润新知