leetcode刷题日记——三数之和
[ 题目描述 ]:
[ 思路 ]:
- 题目要求在数组nums中找出三个数之和为0的所有组合
- 暴力解法:三层 for 循环求得所有情况,然后提出其中相同的情况,时间复杂度O(n3)
- 双指针:遍历数组的每个数 nums[i],将 - nums[i] 作为 target,然后使用双指针求数组 (去除当前这个数后) 两个数的和为-target (要使用双指针前需要先对数组进行排序),即求得了和为0的三个元素,但这个数可能存在多个情况,所有还需要继续遍历数组,求得其他情况的解
- 运行如下
int compare(const void *a, const void *b) {
return (*(int *)a - *(int *)b);
}
int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) {
qsort(nums, numsSize, sizeof(int), compare);
int **result = (int **)malloc(sizeof(int *) * numsSize * numsSize);
*returnColumnSizes = (int *)malloc(sizeof(int) * numsSize * numsSize);
*returnSize = 0;
for (int i = 0; i < numsSize - 2; i++) {
if (i > 0 && nums[i] == nums[i - 1]) continue;
int left = i + 1;
int right = numsSize - 1;
int target = -nums[i];
while (left < right) {
int sum = nums[left] + nums[right];
if (sum == target) {
result[*returnSize] = (int *)malloc(sizeof(int) * 3);
result[*returnSize][0] = nums[i];
result[*returnSize][1] = nums[left];
result[*returnSize][2] = nums[right];
(*returnColumnSizes)[*returnSize] = 3;
(*returnSize)++;
while (left < right && nums[left] == nums[left + 1]) left++;
while (left < right && nums[right] == nums[right - 1]) right--;
left++;
right--;
} else if (sum < target) {
left++;
} else {
right--;
}
}
}
return result;
}
[ 官方题解 ]:
- 一、排序+双指针