题目
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = {3, 2, 12, 4, 5, 6, 7, 9, 10};, target = 15
因为 nums[0] + nums[2] = 3 + 12 = 15
所以返回 [0, 2]
实现效果
代码实现
import java.util.*;
public class TestDemo {
/**
* 给定一个整数数组 nums 和一个目标值 target,在该数组中找出和为目标值的那两个整数,并返回他们的数组下标
* */
public static void main(String[] args) {
int[] nums = {3, 2, 12, 4, 5, 6, 7, 9, 10};
int target = 15;
int[] firstArr = new TestDemo().findFirst(nums, target);
System.out.println("====================原始数组=====================");
System.out.println(Arrays.toString(nums));
System.out.println("====================第一对匹配的数组===============");
System.out.println("两个数字分别为:" + nums[firstArr[0]] + " " + nums[firstArr[1]]);
System.out.println("两个下标分别为:" + firstArr[0] + " " + firstArr[1]);
System.out.println("====================最后一对匹配的数组==============");
int[] lastArr = new TestDemo().findLast(nums, target);
System.out.println("两个数字分别为:" + nums[lastArr[0]] + " " + nums[lastArr[1]]);
System.out.println("两个下标分别为:" + lastArr[0] + " " + lastArr[1]);
System.out.println("====================所有匹配的数组=================");
List<int []> allArr = new TestDemo().findAll(nums, target);
allArr.stream().forEach( a -> {
System.out.println("两个数字分别为:" + nums[a[0]] + " " + nums[a[1]]);
System.out.println("两个下标分别为:" + a[0] + " " + a[1]);
System.out.println("");
});
}
/**
* 在数组中找出第一个和为目标值的那两个整数
* */
public int[] findFirst(int[] nums, int target) {
int[] res = new int[2];
if(nums == null || nums.length == 0){
return res;
}
// k 数组值 v 数组下标
Map<Integer, Integer> map = new HashMap<>();
for(int i = 0; i < nums.length; i++){
//需要的两个整数中另外一个整数
int temp = target - nums[i];
//判断另外一个整数是否存在过
if(map.containsKey(temp)){
res[1] = i;
res[0] = map.get(temp);
break;
}
map.put(nums[i], i);
}
return res;
}
/**
* 在数组中找出最后一个和为目标值的那两个整数
* */
public int[] findLast(int[] nums, int target) {
int[] res = new int[2];
if(nums == null || nums.length == 0){
return res;
}
Map<Integer, Integer> map = new HashMap<>();
for(int i = 0; i < nums.length; i++){
int temp = target - nums[i];
if(map.containsKey(temp)){
res[1] = i;
res[0] = map.get(temp);
}
map.put(nums[i], i);
}
return res;
}
/**
* 在数组中找出所有和为目标值的那两个整数
* */
public List<int []> findAll(int[] nums, int target) {
List<int []> list = new ArrayList<>();
if(nums == null || nums.length == 0){
list.add(nums);
return list;
}
Map<Integer, Integer> map = new HashMap<>();
for(int i = 0; i < nums.length; i++){
int temp = target - nums[i];
if(map.containsKey(temp)){
int[] res = new int[2];
res[1] = i;
res[0] = map.get(temp);
list.add(res);
}
map.put(nums[i], i);
}
return list;
}
}