一、题目描述
二、思路
跟打卡 DAY 21 三数之和思路相同,其中有变化的就是for中需要再嵌套一个for,同样的解题思路可以去解五数之和、六数之和等等,这种方法能将时间复杂度降一个数量级;除此之外,进行的剪枝操作也会稍有不同。
三、解题过程
四、代码
/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
void swap(int *p, int *q){
int tmp = *p;
*p = *q;
*q = tmp;
}
void QuickSort(int* arr, int begin, int end){
if(begin >= end) return;
int key = arr[begin];
int left = begin;
int right = end;
while(left < right){
while(left < right && arr[right] >= key) right --;
while(left < right && arr[left] < key) left ++;
swap(&arr[left], &arr[right]);
}
swap(&arr[begin], &arr[left]);
QuickSort(arr, begin, left);
QuickSort(arr, left + 1, end);
}
int** fourSum(int* nums, int numsSize, int target, int* returnSize, int** returnColumnSizes){
QuickSort(nums, 0, numsSize - 1);
int** res = (int**)malloc(sizeof(int*)*18000);
int left, right;
int index = 0;
for(int i = 0; i < numsSize - 3; i++){
if(nums[i] > target && target > 0) break;
if(i > 0 && nums[i] == nums[i - 1]) continue;
for(int j = i + 1; j < numsSize - 2; j++){
if(nums[i] + nums[j] > target && target > 0) break;
if(j > i + 1 && nums[j] == nums[j - 1]) continue;
left = j + 1;
right = numsSize - 1;
while(left < right){
long long sum = (long long)nums[i] + (long long)nums[j] + (long long)nums[left] + (long long)nums[right];
if(sum < target) left ++;
else if(sum > target) right --;
else{
int* arr = (int*)malloc(sizeof(int) * 4);
arr[0] = nums[i];
arr[1] = nums[j];
arr[2] = nums[left];
arr[3] = nums[right];
res[index ++] = arr;
while(left < right && nums[right] == nums[right - 1]) right --;
while(left < right && nums[left] == nums[left + 1]) left ++;
right --;
left ++;
}
}
}
}
*returnSize = index;
*returnColumnSizes = (int*)malloc(sizeof(int) * index);
for(int k = 0; k < index; k ++){
(*returnColumnSizes)[k] = 4;
}
return res;
}
时间复杂度:O(n^3)。
五、遇到的问题
- 在计算sum时,如果不强行转化各个数的类型,则会溢出(2000000000 + 1000000000 cannot be represented in type 'int')