leecode18 四数之和
我的思路
感觉四数之和和三数之和没什么区别,就将其转化为三数,再转换为两数,就是再三数之和外面再套一层循环而已。
- 这个题的难点在于,这个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/