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;
    }
};
复制代码

 

posted on   itdef  阅读(251)  评论(0编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
历史上的今天:
2019-12-03 Leetcode 1020 飞地的数量

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示