题目描述:
解题思路:
1、排序,根据三数之和的经验,首先对数组排序,这样的很话,确定第一个数字之后,就可以将本题转化成类似三数之和那种的;
2、固定第一个元素,将该题转化为三数之和问题。
具体代码:
1 class Solution { 2 public List<List<Integer>> fourSum(int[] nums, int target) { 3 int len = nums.length; 4 List<List<Integer>> res = new ArrayList<>(); 5 if(len < 4 || nums == null) return res; 6 Arrays.sort(nums); // 对数组排序 7 for(int i = 0; i < len - 3; i++){ // 固定第一个元素 8 if(i > 0 && nums[i] == nums[i-1]) continue; // 防止因为元素重复导致答案一样 9 int min1 = nums[i] + nums[i+1] + nums[i+2] + nums[i+3]; 10 int max1 = nums[i] + nums[len-1] + nums[len-2] + nums[len-3];// 快速判断target是否不存在,target可能存在的条件是min1 < target < max1 11 if(min1 > target || max1 < target){ 12 continue; 13 } 14 for(int j = i + 1; j < len -2; j++){ // 固定第二个元素 15 if(j > i + 1 && nums[j] == nums[j-1]) continue; // 防止结果重复 16 int k = j + 1; 17 int l = len - 1; 18 while(k < l){ // 双指针寻找另外两个数 19 int sum = nums[i] + nums[j] + nums[k] + nums[l]; 20 if(sum < target){ 21 k++; 22 }else if(sum > target){ 23 l--; 24 }else{ // 将和为target的四个数存到结果中 25 ArrayList<Integer> temp = new ArrayList<>(); 26 temp.add(nums[i]); 27 temp.add(nums[j]); 28 temp.add(nums[k]); 29 temp.add(nums[l]); 30 res.add(temp); 31 k++; 32 l--; // 直接移动指针 33 while(k < l && nums[k] == nums[k-1]){ //防止元素重复引起结果重复 34 k++; 35 } 36 while(k < l && nums[l] == nums[l+1]){ 37 l--; 38 } 39 } 40 } 41 } 42 } 43 return res; 44 } 45 }