題目描述
給定一個包含 n 個整數的數組 nums 和一個目標值 target,判斷 nums 中是否存在四個元素 a,b,c 和 d ,使得 a + b + c + d 的值與 target 相等?找出所有滿足條件且不重複的四元組。
注意:
答案中不可以包含重複的四元組。
示例:
給定數組 nums = [1, 0, -1, 0, -2, 2],和 target = 0。
滿足要求的四元組集合爲:
[
[-1, 0, 0, 1],
[-2, -1, 1, 2],
[-2, 0, 0, 2]
]
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/4sum
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
白話題目:
還記得第15題三數之和,16題最接近的三數之和不?這回數組還是那個類似的數組+目標值。找出所有不重複元素的四元組而已。
算法:
有了之前的基礎,這個題就沒有那麼難了。之前是一個i,現在假想固定i,j移動L,R,雙指針。
根據nums[i]+nums[j]+nums[L],nums[R]的值移動指針。
記得去重複啊。
詳細解釋關注 B站 【C語言全代碼】學渣帶你刷Leetcode 不走丟 https://www.bilibili.com/video/BV1C7411y7gB
C語言完全代碼
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
//聲明排序爲整型數組遞增
/**
* 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().
*/
int comp(const void *a,const void *b)
{
return *(int*)a-*(int*)b;
}
int** fourSum(int* nums, int numsSize, int target, int* returnSize, int** returnColumnSizes)
{
int** returnArray = (int**)malloc(sizeof(int*) * (numsSize)*(numsSize)); //Cn3就夠了
if(numsSize<4)
{
return NULL;
}
qsort(nums,numsSize,sizeof(int),comp); //快速排序 升序
//int **ans=(int **)malloc(sizeof(int *)*numsSize*6);
int i,j,L,R;
*returnColumnSizes =(int *)malloc(sizeof(int) *numsSize*numsSize);
*returnSize=0;
for(i=0; i<numsSize-3; i++)
{
if (i>0&&nums[i]==nums[i-1])//i去重
continue;
for(j=i+1; j<numsSize-2; j++)
{
if (j>i+1&&nums[j]==nums[j-1])//j去重
continue;
L=j+1;
R=numsSize-1;
while(L<R)
{
int main()
{
printf("測試數據的個數 6\n");
int numsSize;
scanf("%d",&numsSize);
int nums[numsSize];
int i,j;
printf("測試數據 1, 0, -1, 0, -2, 2\n");
for(i=0; i<numsSize; i++)
{
scanf("%d",&nums[i]);
}
printf("請輸入目標值target:\n");
int target;
scanf("%d",&target);
int returnSize=0;
int **returnColumnSizes =(int**)malloc(sizeof(int*)*numsSize);//
int **resultArray=fourSum( nums, numsSize, target, &returnSize, returnColumnSizes);
printf("%d\n",returnSize);
for(i=0; i<returnSize; i++)
{
for ( j = 0; j < (*returnColumnSizes)[i]; j ++)
{
printf("%d ",resultArray[i][j]) ;
}
printf("\n");
}
return 0;
}