赞
踩
题目:
题解:
- int cmp(const void *x, const void *y)
- {
- return *(int*)x - *(int*)y;
- }
- //判断重复的三元组
- bool TheSame(int a, int b, int c, int **ans, int returnSize)
- {
- bool ret = true;
- for(int i = 0;i < returnSize;++i)
- {
- if(a == ans[i][0] && b == ans[i][1] && c == ans[i][2])
- {
- ret = false;
- break;
- }
- }
- return ret;
- }
- int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes)
- {
- //给nums排序,以便去除重复元素,时间O(nlogn)到O(n2)之间
- qsort(nums, numsSize, sizeof(int), cmp);
- //最多可能的三元组数
- // double maxRoom = 1;
- //ans行大小初始化
- *returnSize = 0;
- //特判
- if(numsSize < 3) return NULL;
- //计算maxRoom,用组合的思想
- // maxRoom = (numsSize) * (numsSize - 1) * (numsSize - 2);
- // maxRoom /= 6;
- //分配返回数组内存
- int **ans = (int**)calloc(20000, sizeof(int*));
- //取一个元素为中间元素,不能取头尾,时间:O(n2)
- for(int i = 0, left = 1, right = numsSize - 1;i < numsSize - 2 && nums[i] <= 0;++i)
- {
- //初始化
- left = i + 1;
- right = numsSize - 1;
- //第一个数定下来之后,双指针法遍历第二和第三个数,时间:O(n)
- while(left < right)
- {
- if(nums[i] + nums[left] + nums[right] < 0)
- {
- ++left;
- }
- else if(nums[i] + nums[left] + nums[right] > 0)
- {
- --right;
- }
- else//符合条件的三元组找到了
- {
- //并且不重复
- if(TheSame(nums[i], nums[left], nums[right], ans, *returnSize))
- {
- ans[(*returnSize)] = (int*)calloc(3, sizeof(int));
- ans[(*returnSize)][0] = nums[i];
- ans[(*returnSize)][1] = nums[left];
- ans[(*returnSize)][2] = nums[right];
- ++(*returnSize);
- }
- ++left;
- --right;
- }
- }
- }
- //申请数组列的内存
- *returnColumnSizes = (int*)calloc((*returnSize), sizeof(int));
- //内存赋值3
- for(int i = 0;i < *returnSize;++i)
- {
- (*returnColumnSizes)[i] = 3;
- }
- return ans;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。