四数之和(集合)

1.给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。
注意:答案中不可以包含重复的四元组。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/4sum
在这里插入图片描述
代码:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
class Solution {
public class Demo_sishu {

	public static void main(String[] args) {
		int[] nums = {1, 0, -1, 0, -2, 2};
		int target = 0;
		System.out.println(fourSum(nums,target)); 
	}
    
	public static List<List<Integer>> fourSum(int[] nums,int target ){
		List<List<Integer>> lists = new ArrayList<>();
		if(nums.length<=3) {
			return lists;
		}
		Arrays.sort(nums);  //数组内利用二分法排序
		int t2 = 2;
		int t3 = nums.length-1;  //指针初始化,分别指向尾部和前面三个数
		for(int i=0;i<nums.length-3;i++) {
			if(i>0 && nums[i-1]==nums[i]) {continue;}//跳过第一个和第二个相同的
			for(int j=i+1;j<nums.length-2;j++) {
				if(j>i+1 && nums[j-1]==nums[j]) {continue;} //跳过第二个和第三个相同的
				t2 = j+1;     //指针指向第三个
				t3 = nums.length-1; //指针指向第四个数(尾部开始)
				while(t2<t3) {
					int sum = nums[i]+nums[j]+nums[t2]+nums[t3];
					if(sum == target) {
						//将数组转换成集合并添加进去
						lists.add(Arrays.asList(nums[i],nums[j],nums[t2],nums[t3]));
						while(t2<t3 && nums[t2] == nums[t2+1]) {t2++;}  //跳过第三个与第四个相同的
						while(t2<t3 && nums[t3] == nums[t3-1]) {t3--;}  //跳过第四个与第三个相同
						t2++; //指针更新
						t3--; //指针更新
					}else if(sum > target) {
						t3--;  //向前寻找合适的值
					}else if(sum<target) {
						t2++;  //向后寻找合适的值
					}
					
				}
			}
		}	
		return lists;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值