18. 四数之和

                                             18. 四数之和

给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。

注意:

答案中不可以包含重复的四元组。

示例:

给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。

满足要求的四元组集合为:
[
  [-1,  0, 0, 1],
  [-2, -1, 1, 2],
  [-2,  0, 0, 2]
]
思路:首先,进行数据排序,四个数(i,j,l,r),先遍历i,j的值(不重复),再首位检查l,r是否符合要求,从j后面开始算起。如果给的数组的长度少于4直接返回空list表.还要注意一点:查重,避免出现重复数据
java的code:

class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
            List<List<Integer>> list = new ArrayList<List<Integer>>();
	        List<Integer> list2  = null;
	        if(nums.length <4) {
	        	return list;
	        }
	        Arrays.sort(nums);
	        
	      
	        int temp = 0;
	        int l = 0;
	        int r = 0;
	        int sum = 0;
	        int arr[] = new int[4];
	        for(int i = 0; i < nums.length - 3;i++) {
	        	for(int j = i+1; j < nums.length - 2; j++ ){
	        	    l = j + 1;
	        	    r = nums.length - 1;
	        	    temp = nums[i] + nums[j];
	        	    while(l < r) {
	        	    	
	        	    	sum = temp + nums[l] + nums[r];
	        	    	if(sum < target){
	        	    		l++;
	        	    	}else if(sum > target) {
	        	    		r--;
	        	    	}else if(sum == target ){
	        	    		arr[0] = nums[i];
	        	    		arr[1] = nums[j];
	        	    		arr[2] = nums[l];
	        	    		arr[3] = nums[r];
                        //  System.out.println(i+"  " + j + "     " +l + "    " + r + "######## " + nums[i] +"  " + nums[j] + "  " + nums[l] + "  " + nums[r]);
	        	    		Arrays.sort(arr);
	        	    		list2 = new ArrayList<Integer>();
	        	    		list2.add(arr[0]);
	        	    		list2.add(arr[1]);
	        	    		list2.add(arr[2]);
	        	    		list2.add(arr[3]);
	        	    		if(!list.contains(list2)&& l != i && l != j && r != i && r != j) {
	        	    			list.add(list2);
	        	    		}
	        	    		while(l < r && nums[l] == nums[l+1]){
	        	    			l++;
	        	    		}
	        	    		while(l < r && nums[r] == nums[r-1]){
	        	    			r--;
	        	    		}
	        	    		 l++;
	        	    		 r--;
	        	    	}
	        	    }
	        	}
	        	
	        }
	        return list;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值