当前位置:   article > 正文

C语言 | Leetcode C语言题解之第15题三数之和

C语言 | Leetcode C语言题解之第15题三数之和

题目:

题解:

  1. int cmp(const void *x, const void *y)
  2. {
  3. return *(int*)x - *(int*)y;
  4. }
  5. //判断重复的三元组
  6. bool TheSame(int a, int b, int c, int **ans, int returnSize)
  7. {
  8. bool ret = true;
  9. for(int i = 0;i < returnSize;++i)
  10. {
  11. if(a == ans[i][0] && b == ans[i][1] && c == ans[i][2])
  12. {
  13. ret = false;
  14. break;
  15. }
  16. }
  17. return ret;
  18. }
  19. int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes)
  20. {
  21. //给nums排序,以便去除重复元素,时间O(nlogn)到O(n2)之间
  22. qsort(nums, numsSize, sizeof(int), cmp);
  23. //最多可能的三元组数
  24. // double maxRoom = 1;
  25. //ans行大小初始化
  26. *returnSize = 0;
  27. //特判
  28. if(numsSize < 3) return NULL;
  29. //计算maxRoom,用组合的思想
  30. // maxRoom = (numsSize) * (numsSize - 1) * (numsSize - 2);
  31. // maxRoom /= 6;
  32. //分配返回数组内存
  33. int **ans = (int**)calloc(20000, sizeof(int*));
  34. //取一个元素为中间元素,不能取头尾,时间:O(n2)
  35. for(int i = 0, left = 1, right = numsSize - 1;i < numsSize - 2 && nums[i] <= 0;++i)
  36. {
  37. //初始化
  38. left = i + 1;
  39. right = numsSize - 1;
  40. //第一个数定下来之后,双指针法遍历第二和第三个数,时间:O(n)
  41. while(left < right)
  42. {
  43. if(nums[i] + nums[left] + nums[right] < 0)
  44. {
  45. ++left;
  46. }
  47. else if(nums[i] + nums[left] + nums[right] > 0)
  48. {
  49. --right;
  50. }
  51. else//符合条件的三元组找到了
  52. {
  53. //并且不重复
  54. if(TheSame(nums[i], nums[left], nums[right], ans, *returnSize))
  55. {
  56. ans[(*returnSize)] = (int*)calloc(3, sizeof(int));
  57. ans[(*returnSize)][0] = nums[i];
  58. ans[(*returnSize)][1] = nums[left];
  59. ans[(*returnSize)][2] = nums[right];
  60. ++(*returnSize);
  61. }
  62. ++left;
  63. --right;
  64. }
  65. }
  66. }
  67. //申请数组列的内存
  68. *returnColumnSizes = (int*)calloc((*returnSize), sizeof(int));
  69. //内存赋值3
  70. for(int i = 0;i < *returnSize;++i)
  71. {
  72. (*returnColumnSizes)[i] = 3;
  73. }
  74. return ans;
  75. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/426489
推荐阅读
相关标签
  

闽ICP备14008679号