对数组排序后,采取三个指针逼近的方式:
指针i遍历,指针l和指针r分别为左右指针,进行比较
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> list=new ArrayList<>();
Arrays.sort(nums);
int m=0;
int l,r;
for(int i=0;i<nums.length-2;i++){
if(i==0 || nums[i]>nums[i-1]){
l=i+1;
r=nums.length-1;
while(l<r){
if(nums[i]+nums[l]+nums[r]==0){
list.add(new ArrayList<Integer>());
list.get(m).add(nums[i]);
list.get(m).add(nums[l]);
list.get(m).add(nums[r]);
m++;
l++;
r--;
while(l<r && nums[l]==nums[l-1]){
l++;
}
while(l<r && nums[r]==nums[r+1]){
r--;
}
}else if(nums[i]+nums[l]+nums[r]>0){
r--;
}else{
l++;
}
}
}
}
return list;
}
}
四数之和
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> list=new ArrayList<>();
Arrays.sort(nums);
int m=0;
int l,r;
for(int i=0;i<nums.length-3;i++){
if(i==0||nums[i]>nums[i-1]){
for(int j=i+1;j<nums.length-2;j++){
if(j==i+1||nums[j]>nums[j-1]){
l=j+1;
r=nums.length-1;
while(l<r){
if(nums[i]+nums[j]+nums[l]+nums[r]==target){
list.add(new ArrayList<Integer>());
list.get(m).add(nums[i]);
list.get(m).add(nums[j]);
list.get(m).add(nums[l]);
list.get(m).add(nums[r]);
m++;
l++;
r--;
while(l<r&&nums[l]==nums[l-1]){
l++;
}
while(l<r&&nums[r]==nums[r+1]){
r--;
}
}else if(nums[i]+nums[j]+nums[l]+nums[r]>target){
r--;
}else{
l++;
}
}
}
}
}
}
return list;
}
}
k数之和
public static ArrayList<List<Integer>> kSum(int nums[],int target,int k, int start){
ArrayList<List<Integer>> res = new ArrayList<List<Integer>>();
if(start>=nums.length)
return res;
if(k==2){
int l = start, h = nums.length-1;
while(l<h){
if(nums[l]+nums[h]==target){
List<Integer> list = new ArrayList<>();
list.add(nums[l]);
list.add(nums[h]);
res.add(list);
while(l<h&&nums[l]==nums[l+1])
l++;
while(l<h&&nums[h]==nums[h-1])
h--;
l++;
h--;
}else if(nums[l]+nums[h]<target)
l++;
else
h--;
}
return res;
}
if(k>2){
for(int i=start;i<nums.length-k+1;i++){
ArrayList<List<Integer>> temp = kSum(nums, target - nums[i], k - 1, i + 1);
if(temp!=null) {
for (List<Integer> l : temp) {
l.add(0, nums[i]);
}
res.addAll(temp);
}
while(i<nums.length-1&&nums[i]==nums[i+1]){
i++;
}
}
return res;
}
return res;
}