1. 程式人生 > >N SUM 陣列中任意數相加的結果等於剩下的數相加和

N SUM 陣列中任意數相加的結果等於剩下的數相加和

陣列中任意數相加的和等於剩下的數相加的和:

比如{1,2,3}   1+2=3,所以是滿足條件的。

仔細分析下這樣的陣列其實首先要滿足一下幾個條件:

1.陣列整個數相加要是偶數。(a+b+c+*+****=2d)

2.陣列中的最大數不能超過整個陣列和的1/2,因為最大數肯定也在某一邊,超過1/2的話,不成立。(不存在負數的情況下)

java程式碼如下 

/**
 * 
 */
package com.cxm;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * @author admin
 *
 */
public class NSum
{
	private static int[] array={1,1,2,3,1,2,2,2,2,1,1,1,1}; 
	
	public static boolean isNSumNum(){
		int sum =0 ;
		int k = array.length;
		for(int i = 0;i<k;i++){
			sum+=array[i];
		}
		//如果陣列的總和不是偶數,這個陣列肯定不滿足條件
		if((sum&1)==1){
			return false;
		}
		int middle = sum>>1;
		Arrays.sort(array);
		int larget = array[k-1];
		
		//最大值肯定在一組中,如果最大值比均值大,這個陣列肯定不滿足條件
		if(larget>middle){
			return false;
		}
		if(larget==middle){
			return true;
		}
		
		int newTarget = middle-larget;
		
		for(int i =0;i<array.length&&array[i]<=newTarget;i++){
			if(array[i]==newTarget){
				return true;
			}
		}
		
		return threeSum(newTarget,-1);
	}
	
	public static boolean threeSum(int target,int z){
		for(int i = z+1 ;i<array.length&&array[i]<=target;i++){
			if(twoSum1(target-array[i],i)){
				return true;
			}else{
				return threeSum(target-array[i],i);
			}
		}
		return false;
	}
	
	/**
	 * 兩個數相加的目標位target
	 * @param target
	 */
	public static boolean twoSum1(int target,int z){
		Map<Integer,Integer> map = new HashMap<Integer,Integer>();
		for(int i =z+1;i<array.length&&array[i]<=target;i++){
			if(!map.containsKey(array[i])){
				map.put(target-array[i], i);
			}
			if(map.containsKey(array[i])){
				int k = map.get(array[i]);
				if(i!=k&&z!=i&&k!=z){
					return true;
				}
			}
		}
		return false;
	}
	
	public static void main(String[] args)
	{
		System.out.println(isNSumNum());
	}
}