【每日一题】LeetCode 46. 全排列

每日一题,防止痴呆 = =

一、题目大意

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

二、题目思路以及AC代码

这题,就很明显,DFS求全排列,没有什么可以说的思路 = = ,但是官方解答只给了一种方法,其实还可以利用c++库函数完成第二种方法,虽然原理是一样的。

第一种DFS全排列就是基础算法,没有什么可以说的。

其实c++库函数中有一个函数是next_permutation,可以求比当前排列大的下一个排列,所以也可以用于这题的编码,但是需要注意的是,要求用next_permutation求全排列的时候,第一个排列必须保证其实最小的,也就是开始要对整个数组从小到大排个序,当然你也可以同时用next_permutation和pre_permutation,= =

下面给出两种的实现代码吧,其实用库函数的方法内存还少用了一点,而且代码简洁,虽然都是超过100%

库函数版本:

#include <algorithm>

class Solution {
public:
    vector<vector<int>> permute(vector<int>& nums) {
        vector<vector<int>> res;
        
        sort(nums.begin(), nums.end());

        do {
            vector<int> tmp = nums;
            res.push_back(tmp);
        } while(next_permutation(nums.begin(), nums.end()));

        return res;
    }
};

DFS版本:

bool* vis;

void dfs(vector<vector<int>>& res, vector<int>& nums, int num, vector<int>& tmp) {
    int n_size = nums.size();
    if (num == n_size) {
        vector<int> add = tmp;
        res.push_back(add);
        return ;
    }

    for (int i=0;i<n_size;i++) {
        if (vis[i]) continue;
        vis[i] = true;
        tmp[num] = nums[i];
        dfs(res, nums, num + 1, tmp);
        vis[i] = false;
    }

    return ;
}

class Solution {
public:
    vector<vector<int>> permute(vector<int>& nums) {
        int n_size = nums.size();
        vis = new bool[n_size];
        for (int i=0;i<n_size;i++) vis[i] = false;

        vector<int> tmp(n_size);
        vector<vector<int>> res;
        dfs(res, nums, 0, tmp);

        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值