
我的思路
感觉四数之和和三数之和没什么区别,就将其转化为三数,再转换为两数,就是再三数之和外面再套一层循环而已。
- 这个题的难点在于,这个h,i,j,k四个参数,我们如何编写代码,能够实现去重操作
|h和i都是外层循环,我们要再循环开始要对其进行去重,j和k是内部代码和三数之和的去重方式一样。
而i的去重和h有关,不再像是三数之和的那样,当i大于0的时候就可以去重了。 - 这个题还有一个需要注意的地方就是这个类型转换,这个四个数的和超出了这个int的范围,所以我们需要在四数相加的地方进行强制类型转换。
public List<List<Integer>> fourSum(int[] nums, int target) {
//感觉四数之和和三数之和没什么区别,就将其转化为三数,再转换为两数
Arrays.sort(nums);
int n = nums.length;
List<List<Integer>> ans = new ArrayList<>();
for(int h = 0; h<n-3;h++){
if(h>0&&nums[h]==nums[h-1]){
continue;
}
if((long)nums[h]+nums[h+1]+nums[h+2]+nums[h+3]>target){
break;
}
if((long)nums[h]+nums[n-1]+nums[n-2]+nums[n-3]<target){
continue;
}
for(int i = h+1;i<n-2;i++){
if(i>h+1&&nums[i]==nums[i-1]){
continue;
}
int j = i+1;
int k = n-1;
while(j<k){
long x = (long) nums[h]+nums[i]+nums[j]+nums[k];
if(x<target){
j++;
}else if(x>target){
k--;
}else {
ans.add(Arrays.asList( nums[h],nums[i],nums[j],nums[k]));
j++;
while(j<k&&nums[j]==nums[j-1]) j++;
k--;
while(j<k&&nums[k]==nums[k+1]) k--;
}
}
}
}
return ans;
}
灵神的思路
灵神的思路和我一样,只不过他比我多优化了,我只在h的循环中进行了优化,灵神再i的循环中也进行了优化。
for (int b = a + 1; b < n - 2; b++) { // 枚举第二个数
long y = nums[b];
if (b > a + 1 && y == nums[b - 1]) continue; // 跳过重复数字
if (x + y + nums[b + 1] + nums[b + 2] > target) break; // 优化一
if (x + y + nums[n - 2] + nums[n - 1] < target) continue; // 优化二
作者:灵茶山艾府
链接:https://leetcode.cn/problems/4sum/solutions/2344514/ji-zhi-you-hua-ji-yu-san-shu-zhi-he-de-z-1f0b/
770

被折叠的 条评论
为什么被折叠?



