No.1原题:
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
解题:直接嵌套循环的方式 就不写,主要用hash表的解题 时间复杂度较低。另外延伸三个数字之和的目标值 思路一样 加一层循环 分解为两个数之和…
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* EntranceLeetCode
*
* @author :梵若
* @create 2018-11-07 20:09
**/
public class EntranceLeetCode {
/**
* 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
**/
private static int[] sumTwo(int[] arrs,int target){
Map<Integer,Integer> resultMap = new HashMap<Integer,Integer>();
for (int i = 0; i < arrs.length; i++) {
if(arrs[i] >= target) {
continue;
}
if (resultMap.containsKey(target - arrs[i])) {
return new int[] {resultMap.get(target - arrs[i]), i};
} else {
resultMap.put(arrs[i], i);
}
}
throw new RuntimeException("not find target data index");
}
/**
* 延伸三个数字之和的目标值
* @param arrs
* @param targetThree
* @return
*/
private static int[] sumThree(int[] arrs,int targetThree){
for (int i = 0; i < arrs.length; i++) {
if(arrs[i] >= targetThree){
continue;
}
int targetTwo = targetThree - arrs[i];
Map<Integer,Integer> twoResultMap = new HashMap<>(2);
for (int j = i+1; j < arrs.length; j++) {
if(arrs[j] >= targetTwo){
continue;
}
if(twoResultMap.containsKey(targetTwo - arrs[j])){
return new int[]{i,twoResultMap.get(targetTwo - arrs[j]),j};
}else{
twoResultMap.put(arrs[j],j);
}
}
}
throw new RuntimeException("not find target data index");
}
public static void main(String[] args) {
int [] arrs ={20,2,4,8,9,1,5,6};
int [] resultTwo = sumTwo(arrs,17);
System.out.println("sumTwo:"+resultTwo[0] +"," +resultTwo[1]);
int [] resultThree = sumThree(arrs,17);
System.out.println("sumThree:"+resultThree[0] +"," +resultThree[1]+"," +resultThree[2]);
}
}