4SumII

LeetCode第16题。

题意大概是:给定4个长度相等的int数组,从每个数组中任取一个值相加和为0,问共有多少种选择方式?数据大小在0-500.

分析:如果暴力求解,用四重循环,时间复杂度O(n4),肯定会超时,不可取。用三层循环,使用一个查找表,时间复杂度为O(n3),很吃力,估计会超时。如果将前2个数组选取的2个值的和与出现的频次以键值对的方式存入Map中,村完后,然后在另外两个数组中两重循环遍历进行查表(以差值进行查表),设计一个计数器,若存在,则加上哈希值(即出现的频次),时间复杂度为O(n2)级别。5002=250000 ,计算机能够在1s之内计算完,是一个可行的方案。

附代码:

public static int fourSumCount(int[] A, int[] B, int[] C, int[] D) {
	    int count=0;
	    HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
	    for(int i=0;i<A.length;i++){
	    	for(int j=0;j<B.length;j++){
	    		int sum1 = A[i]+B[j];
	    		if(map.containsKey(sum1)){
	    			map.put(sum1, map.get(sum1)+1);
	    		}else{
	    			map.put(sum1,1);
	    		}
	    	}
	    }
	    for(int i=0;i<C.length;i++){
	    	for(int j=0;j<D.length;j++){
	    		int sum2 = 0-C[i]-D[j];
	    		if(map.containsKey(sum2)&&map.get(sum2)>0){
	    			count+=map.get(sum2);	    			
	    		}
	    	}
	    }
		return count;   
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值