zoukankan      html  css  js  c++  java
  • LeetCode 046. 全排列 dfs 和 dfs_swap

    地址 https://leetcode-cn.com/problems/permutations/submissions/

    给定一个 没有重复 数字的序列,返回其所有可能的全排列。
    
    示例:
    
    输入: [1,2,3]
    输出:
    [
      [1,2,3],
      [1,3,2],
      [2,1,3],
      [2,3,1],
      [3,1,2],
      [3,2,1]
    ]

    算法1
    使用DFS 进行填充的尝试
    使用了vis数组标注那些数字已经使用 那些没有使用

    class Solution {
    public:
        vector<int> vis;
        vector<vector<int>> ans;
        vector<int> v;
        void dfs(vector<int>& nums, int idx)
        {
            if (idx > nums.size()) return;
            if (idx == nums.size()) {
                ans.push_back(v);
                return;
            }
    
            for (int i = 0; i < nums.size(); i++) {
                if (vis[i] == 0) {
                    v[idx] = nums[i];
                    vis[i] = 1;
                    dfs(nums, idx + 1);
                    vis[i] = 0;
                    v[idx] = -1;
                }
            }
    
    
            return;
        }
    
        vector<vector<int>> permute(vector<int>& nums) {
            int len = nums.size();
            vis = vector<int>(len,0);
            v = vector<int>(len, -1);
            dfs(nums, 0);
            return ans;
        }
    };

    算法2
    直接每局索引 交换nums的两个索引 就得到新的组合
    关键是如何取得交换的两个索引 保证不漏不重
    代码流程 从索引0开始分别后索引1,2,3~~~n的数字交换 得到新的组合
    由于还有不交换的情况 索引考虑了索引0和索引0的交换

    class Solution {
    public:
        vector<vector<int>> ans;
    
        void dfs(vector<int>& nums, int idx)
        {
            if (idx >= nums.size()) return;
            if (idx == nums.size() - 1) {
                ans.push_back(nums);
                return;
            }
    
    
            for (int i = idx ; i < nums.size(); i++) {
                swap(nums[i], nums[idx]);
                dfs(nums, idx + 1);
                swap(nums[i], nums[idx]);
            }
        }
    
    
        void printVec(const vector<vector<int>>& ans) {
            for (auto& e : ans) {
                for (auto&ee : e) {
                    cout << ee << " ";
                }
                cout <<  endl;
            }
        }
    
        vector<vector<int>> permute(vector<int>& nums) {
            dfs(nums, 0);
    
            //printVec(ans);
            return ans;
        }
    };
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    java泛型
    跨域传递
    laravel的一些语法
    去重
    laravel的一些查询语句
    mysql把之前表单进行拆分
    Laravel5.1接收json数据
    thinkphp5 composer安装验证码
    关于地图经纬度的问题
    tp5分组查询
  • 原文地址:https://www.cnblogs.com/itdef/p/14080766.html
Copyright © 2011-2022 走看看