LeetCode18:四数之和

题目描述:

解题思路:

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 }
原文地址:https://www.cnblogs.com/zhang-yi/p/12901119.html