LeetCode 454 四数相加
给你四个整数数组
nums1
、nums2
、nums3
和nums4
,数组长度都是n
,请你计算有多少个元组(i, j, k, l)
能满足:
0 <= i, j, k, l < n
nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0
示例 1:
输入: nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2]
输出: 2
解释: 两个元组如下:1. (0, 0, 0, 1) -> nums1[0] + nums2[0] + nums3[0] + nums4[1] = 1 + (-2) + (-1) + 2 = 02. (1, 1, 0, 0) -> nums1[1] + nums2[1] + nums3[0] + nums4[0] = 2 + (-1) + (-1) + 0 = 0
示例 2:
输入: nums1 = [0], nums2 = [0], nums3 = [0], nums4 = [0]
输出: 1
思路
构建A、B两个数组,A数组存nums1和nums2各个元素之和,B数组存nums3和nums4各个元素之和,使得原问题简化为两数之和,对A、B两个数组进行升序排序。对两个数组,一个从 小 -> 大 另外一个从 大 ->小 遍历模拟两数和中的双指针。
遍历比较当A[less] + B[more] == 0时,对A,B数组进行处理,记录满足的数有几个,即A中值为A[less]的元素有几个,B中值为B[more]的元素有几个,记录的同时改变less、more的位置,跳过值相等的这几个元素,从不重复的值的下标开始重新进行比较。
要是不满足相加等于0就直接根据两者大小进行处理
- A[less] + B[more] > 0 —> more左移
- A[less] + B[more] < 0 —> left右移
代码实现
int cmpInt(const void* a,const void* b)
{
return *(int* )a - *(int* )b;
}
//去重并且计数
int duplicateRemovalAndCount(int* nums,int numsSize,int index