题目描述:
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
题目解答:
方法1:回溯
使用循环+递归,并利用标记数组,来标记每个数字是否使用过,使用过则跳过,没使用过则可以使用,并且要记得取消标记。
运行时间4ms,代码如下。
/**
* Return an array of arrays of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
void dfs(int*** result, int* size, int* before, int bef, int n, int* nums, bool* flag) {
if(bef == n) {
(*size)++;
result[0] = (int**)realloc(result[0], *size * sizeof(int*));
result[0][*size - 1] = (int*)malloc(n * sizeof(int));
memcpy(result[0][*size - 1], before, n * sizeof(int));
return;
}
int i = 0;
for(i = 0; i < n; i++) {
if(!flag[i]) {
flag[i] = true;
before