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

    给定一个没有重复数字的序列,返回其所有可能的全排列。

    示例:

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

    方法一:不用swap回溯状态

    第二个swap函数的作用是保证在整个for循环中,每一次循环开始时,序列都保持和刚进入本次递归时一致,事实上并没有这个必要。
    如果用swap恢复状态会出现什么问题呢?假设序列为nums[t],nums[t+1],...,nums[k],nums[k+1],...,到了要交换nums[t]和nums[k]位置的时候,序列变为nums[k],nums[t+1],...,nums[t],nums[k+1],... 。那么进入下一次递归要处理的序列就是nums[t+1],...,nums[t],nums[k+1],... ,但是这个序列并不是有序的,因此也就不能保证最后的结果保持字典序。
    而如果不恢复状态,到了要交换nums[t]和nums[k]位置的时候,序列则是变成nums[k],nums[t],...,nums[k-1],nums[k+1],...,也就相当于nums[k]放在了t位置,而原序列t到k-1位置的元素全都右移了一位,nums[t],...,nums[k-1],nums[k+1],...依然有序,因此进入下一次递归时要处理的序列仍旧有序。

        vector<vector<int>> res;
        //这里的nums不用引用,它是各个节点当前状态对应的序列,这些序列互不相同。
        void backtrack(int t,vector<int> nums){
            if(t==nums.size()) {
                res.push_back(nums);
                return;
            }
            for(int i=t;i<nums.size();++i){
                swap(nums[i],nums[t]);
                backtrack(t+1,nums);
                //swap(nums[i],nums[t]);
            }
        }
        vector<vector<int>> permute(vector<int>& nums) {
            backtrack(0,nums);
            return res;
        }
    

    方法二:for循环之前对待选部分排序

        vector<vector<int>> res;
        //这里的nums不用引用,它是各个节点当前状态对应的序列,这些序列互不相同。
        void backtrack(int t,vector<int> nums){
            if(t==nums.size()) {
                res.push_back(nums);
                return;
            }
            sort(nums.begin()+t,nums.end());
            for(int i=t;i<nums.size();++i){
                swap(nums[i],nums[t]);
                backtrack(t+1,nums);
                swap(nums[i],nums[t]);
            }
        }
        vector<vector<int>> permute(vector<int>& nums) {
            backtrack(0,nums);
            return res;
        }
    
  • 相关阅读:
    php编程规范整理
    约瑟夫环问题的实现
    MYSQL中SHOW的使用整理收藏
    mysql使用存储过程&函数实现批量插入
    浅谈select for update 和select lock in share mode的区别
    jQuery对象扩展方法(Extend)深度解析
    WCF系列教程之WCF操作协定
    WCF系列教程之WCF实例化
    WCF系列教程之WCF中的会话
    WCF系列教程之WCF服务协定
  • 原文地址:https://www.cnblogs.com/Frank-Hong/p/13303028.html
Copyright © 2011-2022 走看看