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 2020-12-03 15:52  itdef  阅读(244)  评论(0编辑  收藏  举报

导航