全排列
https://leetcode-cn.com/problems/permutations/submissions/
int count(int m);void solution(int* nums, int p, bool* choose, int* temp, int** result, int* m, int numsSize);int** permute(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){//初始化标记数组bool* choose = malloc(sizeof(bool) * numsSize);for(int i = 0; i < numsSize; i++)choose[i] = false;//存放每一组结果int* temp = malloc(sizeof(int) * numsSize);//m为全排列行数int m = count(numsSize);int** result = malloc(sizeof(int*) * m);for(int i = 0; i < m; i++)result[i] = malloc(sizeof(int) * numsSize);//c为当前行数int c = 0;int *p = &c;solution(nums, numsSize, choose, temp, result, p, numsSize);*returnSize = m;*returnColumnSizes = (int *)malloc(sizeof(int) * m);for (int i = 0; i < m; i++)(*returnColumnSizes)[i] = numsSize;return result;}int count(int m){int count = 1;while(m > 0){count = count * m;m--;}return count;}void solution(int* nums, int p, bool* choose, int* temp, int** result, int* m, int numsSize){if(p != 0){for(int i = 0; i < numsSize; i++){if(*(choose + i))continue;choose[i] = true;temp[numsSize - p] = nums[i];solution(nums, p - 1, choose, temp, result, m, numsSize);choose[i] = false;}}else{for(int i = 0; i < numsSize; i++)result[*m][i] = temp[i];(*m)++;}}
int count(int m);void solution(int* nums, int p, int* temp, int** result, int* m, int numsSize);int** permute(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){//存放每一组结果int* temp = malloc(sizeof(int) * numsSize);//m为全排列行数int m = count(numsSize);int** result = malloc(sizeof(int*) * m);for(int i = 0; i < m; i++)result[i] = malloc(sizeof(int) * numsSize);//c为当前行数int c = 0;int *p = &c;solution(nums, numsSize, temp, result, p, numsSize);*returnSize = m;*returnColumnSizes = (int *)malloc(sizeof(int) * m);for (int i = 0; i < m; i++)(*returnColumnSizes)[i] = numsSize;return result;}int count(int m){int count = 1;while(m > 0){count = count * m;m--;}return count;}void swap(int* a, int* b){int temp = *a;*a = *b;*b = temp;}void solution(int* nums, int p, int* temp, int** result, int* m, int numsSize){if(p != 0){for(int i = numsSize - p; i < numsSize; i++){temp[numsSize - p] = nums[i];swap(&nums[i], &nums[numsSize - p]);solution(nums, p - 1, temp, result, m, numsSize);swap(&nums[i], &nums[numsSize - p]);}}else{for(int i = 0; i < numsSize; i++)result[*m][i] = temp[i];(*m)++;}}
