在解决了数组中的两个数相加为一个目标值之后,问题有所提升:序列中的三个数相加的和为目标值。
思路:前面解决了两个数相加,那么从数组的头开始遍历
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