zoukankan      html  css  js  c++  java
  • leetcode46 全排列

    题目https://leetcode-cn.com/problems/permutations/

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

    样例输入与输出

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

    思路

    • 标准的全排列问题,用dfs的方法实现,vis[]记录元素是否已经访问过,以避免在递归中重复取到元素,可以算做dfs的一个模板,不难得出解答树:

    代码

    class Solution {
    public:
        vector<vector<int>> permute(vector<int>& nums) {
            vector<vector<int>> ans;
            tmp.resize(nums.size());
            vis.resize(nums.size());
            dfs(nums, 0, ans);
            return ans;
        }
    private:
        vector<int> tmp;
        vector<int> vis;
        void dfs(vector<int>& nums, int cur, vector<vector<int> >& ans){
            if(cur == nums.size()){
                ans.push_back(tmp);
                return;
            }
            for(int i = 0; i < nums.size(); ++i){
                if(!vis[i]){
                    vis[i] = 1;
                    tmp[cur] = nums[i];
                    dfs(nums, cur+1, ans);
                    vis[i] = 0;
                }
            } 
        }    
    };
    
    • 官方题解上有一个更快的做法,不需要借助vis[]tmp[]数组,将在tmp[]数组中放入元素的操作用swap()替换,思路是一样的,只是这样做效率更高。

    代码

    class Solution {
    public:
        void dfs(int cur, int n, vector<int>& nums, vector<vector<int>>& ans){
            if(cur == n){
                ans.push_back(nums);
            }
            for(int i = cur; i < n; ++i){
                swap(nums[i], nums[cur]);
                dfs(cur+1, n, nums, ans);
                swap(nums[i], nums[cur]);
            }
        }
        vector<vector<int>> permute(vector<int>& nums) {
            vector<vector<int>> ans;
            dfs(0, nums.size(), nums, ans);
            return ans;
        }
    };
    
  • 相关阅读:
    C++笔记--模板
    C++笔记--抽象机制
    C++--VECTOR的简单应用
    C++面试笔记--STL模板与容器
    C++面试笔记--指针和引用
    《转载》什么变量在堆内存里存放,什么变量在栈内存里存放
    C++面试笔记--const、sizeof
    C++面试笔记--宏定义
    C++笔记--指针数组和结构
    C++笔记--异常
  • 原文地址:https://www.cnblogs.com/patrolli/p/12241456.html
Copyright © 2011-2022 走看看