每日一题,防止痴呆 = =
一、题目大意
给定一个 没有重复 数字的序列,返回其所有可能的全排列。
二、题目思路以及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;
}
};