N SUM 陣列中任意數相加的結果等於剩下的數相加和
阿新 • • 發佈:2019-01-09
陣列中任意數相加的和等於剩下的數相加的和:
比如{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()); } }