电商网站做订单退款怎么测试的/seo流量是什么
[ 题目描述 ]:
[ 思路 ]:
- 题目要求在数组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;
}
[ 官方题解 ]:
- 一、排序+双指针