LeetCode 47.全排列II https://leetcode-cn.com/problems/permutations-ii/
/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
#define MAX_SIZE 1000
int count;
int mycmp(const void *a, const void *b)
{
return *(int*)a - *(int*)b;
}
void dfs(int* nums, int numsSize, int depth, int* cur, bool* used, int** res)
{
if (depth == numsSize) {
res[count] = (int*)malloc(numsSize * sizeof(int));
memcpy(res[count], cur, numsSize * sizeof(int));
count++;
return;
}
for (int i = 0; i < numsSize; i++) {
if (used[i] == true) {
continue;
}
if (i != 0 && nums[i - 1] == nums[i] && used[i - 1] == false) {
continue;
}
cur[depth] = nums[i];
used[i] = true;
dfs(nums, numsSize, depth + 1, cur, used, res);
used[i] = false;
}
}
int** permuteUnique(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
qsort(nums, numsSize, sizeof(int), mycmp);
int** res = (int**)malloc(MAX_SIZE * sizeof(int*));
int* cur = (int*)malloc(numsSize * sizeof(int));
bool* used = (bool*)malloc(numsSize * sizeof(bool));
memset(used, 0, numsSize * sizeof(bool));
count = 0;
dfs(nums, numsSize, 0, cur, used, res);
*returnSize = count;
*returnColumnSizes = (int*)malloc(count * sizeof(int));
for (int i = 0; i < count; i++) {
(*returnColumnSizes)[i] = numsSize;
}
return res;
}