THREE SUM

在解决了数组中的两个数相加为一个目标值之后,问题有所提升:序列中的三个数相加的和为目标值。

思路:前面解决了两个数相加,那么从数组的头开始遍历

     for 0— i ->n   三个数的和为 sum

           那么sum – array[i]就是剩下两个数相加的目标和。

这时候就可以将问题推到我们两个数相加的代码上,只要调用两个数相加目标和为某值的方法。

代码如下:

	/**
	 * 两个数相加的目标位target
	 * @param target
	 */
	public static void 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){
				System.out.println("i is "+i+"  j is "+k+" z is "+z);
				}
			}
		}
	}
	/**
	 * 三个数相加的目标和为target
	 * @param target
	 * @param z
	 */
	public static void threeSum(int target,int z){
		for(int i = z+1 ;i<array.length&&array[i]<=target;i++){
			twoSum1(target-array[i],i);
		}
	}

那么一次类推,如果是四个数的和为一个目标值,那么代码就应该是这样的:

	public static void fourSum(int target){
		for(int i =0;i<array.length&&array[i]<=target;i++){
			threeSum(target-array[i],i);
		}
	}

由此我们可以看出一定的规律,那么这将引出我们下面的一个问题:

 

判断给定数组中的任意的数相加的和等于剩下的数相加的和?

例如:{1,2,3}   1+2 =3  true

            {1,3,3}    false

            {2,1,4,7}   2+1+4=7   true

             {1,2,4,4,3}    1+2+4=4+3  true

点赞