全排列

https://leetcode-cn.com/problems/permutations/submissions/

  1. int count(int m);
  2. void solution(int* nums, int p, bool* choose, int* temp, int** result, int* m, int numsSize);
  3. int** permute(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
  4. //初始化标记数组
  5. bool* choose = malloc(sizeof(bool) * numsSize);
  6. for(int i = 0; i < numsSize; i++)
  7. choose[i] = false;
  8. //存放每一组结果
  9. int* temp = malloc(sizeof(int) * numsSize);
  10. //m为全排列行数
  11. int m = count(numsSize);
  12. int** result = malloc(sizeof(int*) * m);
  13. for(int i = 0; i < m; i++)
  14. result[i] = malloc(sizeof(int) * numsSize);
  15. //c为当前行数
  16. int c = 0;
  17. int *p = &c;
  18. solution(nums, numsSize, choose, temp, result, p, numsSize);
  19. *returnSize = m;
  20. *returnColumnSizes = (int *)malloc(sizeof(int) * m);
  21. for (int i = 0; i < m; i++)
  22. (*returnColumnSizes)[i] = numsSize;
  23. return result;
  24. }
  25. int count(int m){
  26. int count = 1;
  27. while(m > 0){
  28. count = count * m;
  29. m--;
  30. }
  31. return count;
  32. }
  33. void solution(int* nums, int p, bool* choose, int* temp, int** result, int* m, int numsSize){
  34. if(p != 0){
  35. for(int i = 0; i < numsSize; i++){
  36. if(*(choose + i))
  37. continue;
  38. choose[i] = true;
  39. temp[numsSize - p] = nums[i];
  40. solution(nums, p - 1, choose, temp, result, m, numsSize);
  41. choose[i] = false;
  42. }
  43. }
  44. else{
  45. for(int i = 0; i < numsSize; i++)
  46. result[*m][i] = temp[i];
  47. (*m)++;
  48. }
  49. }
  1. int count(int m);
  2. void solution(int* nums, int p, int* temp, int** result, int* m, int numsSize);
  3. int** permute(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
  4. //存放每一组结果
  5. int* temp = malloc(sizeof(int) * numsSize);
  6. //m为全排列行数
  7. int m = count(numsSize);
  8. int** result = malloc(sizeof(int*) * m);
  9. for(int i = 0; i < m; i++)
  10. result[i] = malloc(sizeof(int) * numsSize);
  11. //c为当前行数
  12. int c = 0;
  13. int *p = &c;
  14. solution(nums, numsSize, temp, result, p, numsSize);
  15. *returnSize = m;
  16. *returnColumnSizes = (int *)malloc(sizeof(int) * m);
  17. for (int i = 0; i < m; i++)
  18. (*returnColumnSizes)[i] = numsSize;
  19. return result;
  20. }
  21. int count(int m){
  22. int count = 1;
  23. while(m > 0){
  24. count = count * m;
  25. m--;
  26. }
  27. return count;
  28. }
  29. void swap(int* a, int* b){
  30. int temp = *a;
  31. *a = *b;
  32. *b = temp;
  33. }
  34. void solution(int* nums, int p, int* temp, int** result, int* m, int numsSize){
  35. if(p != 0){
  36. for(int i = numsSize - p; i < numsSize; i++){
  37. temp[numsSize - p] = nums[i];
  38. swap(&nums[i], &nums[numsSize - p]);
  39. solution(nums, p - 1, temp, result, m, numsSize);
  40. swap(&nums[i], &nums[numsSize - p]);
  41. }
  42. }
  43. else{
  44. for(int i = 0; i < numsSize; i++)
  45. result[*m][i] = temp[i];
  46. (*m)++;
  47. }
  48. }