给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a b c d 的值与 target 相等?找出所有满足条件且不重复的四元组。 注意:答案中不可以包含重复的四元组。
示例 1: 输入:nums = [1,0,-1,0,-2,2], target = 0 输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]] 示例 2:
输入:nums = [], target = 0 输出:[]
class Solution { public List<List<Integer>> fourSum(int[] nums, int target) { /** 双指针做法: 类似于三数之和 规定两个元素, 使用双指针确定后面两个元素 注意去重不用set了,而是后面遇到重复元素就跳过 */ List<List<Integer>> res=new ArrayList(); if(nums==null||nums.length<4){ return res; } Arrays.sort(nums);//排序 for(int i=0;i<nums.length-3;i ){ if(i>0&&nums[i]==nums[i-1]) continue; // 相邻的元素相等,跳过 ,去重 for(int j=i 1;j<nums.length-2;j ){ if(j>i 1&&nums[j]==nums[j-1]) continue; //相邻的元素相等,跳过 ,去重 int left=j 1;//确定最后两个元素 int right=nums.length-1; while(left<right){ int sum=nums[i] nums[j] nums[left] nums[right]; if(sum==target){ res.add(Arrays.asList(nums[i],nums[j],nums[left],nums[right])); //去重 while(left<right){ if(nums[right]==nums[--right]){ continue; }else { break; } } //去重 while(left<right){ if(nums[left]==nums[ left]){ continue; }else { break; } } }else if(sum<target){ left ; }else if(sum>target){ right--; } } } } return res; } }