每日算法(二十)-java给定一个数组,求是否存在数组里的四个元素相加等于目标数

每日算法(二十)-java给定一个数组,求是否存在数组里的四个元素相加等于目标数

结果可能不止一个,每个可能里面又包含了四个元素,所以这里用链表来存
最先确定第一个数和第二个数,就是普通循环确定,然后根据先两个数找出来了,再利用二分查找去找后两个数,代码如下

public static List<List<Integer>> fourSum(int arr[],int target){
	List<List<Integer>> list=new ArrayList<>();
	if(arr.length<4||arr==null){
		return list;
	}
	Arrays.sort(arr);
	for(int i=0;i<arr.length-3;i++) {                   //取第一个数
		if(i>0&&arr[i-1]==arr[i])                               
			continue;
		for(int j=i+1;j<arr.length-2;j++){              //取第二个数
	 			if(j!=i+1 && arr[j]==arr[j-1])
					continue;
				int start=j+1;                                             //取第三个第四个数
				int end=arr.length-1;
				while(start<end){
					int sum=arr[i]+arr[j]+arr[start]+arr[end];
					if(sum==target){
						List<Integer> li=new ArrayList<>();
						li.add(arr[i]);
						li.add(arr[j]);
						li.add(arr[start]);
						li.add(arr[end]);
						list.add(li);
						while(start<end &&arr[start+1]==arr[end])
							start++;
							while(start<end&&arr[end-1]==arr[end])
						end--;
							start++;
							end--;
					}else if(sum<target)
						start++;
					else
						end--;
			}
				
		}
	}

	
	return list;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值