给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
方法一:使用HushMap
遍历数组,将每个元素作为键(key)存入哈希表中,同时将其下标作为值(value)。在遍历过程中,我们检查目标值(target)减去当前元素(arr[i])的差是否存在于哈希表中。如果存在,则说明找到了两个数的和为目标值,返回这两个数的下标即可。
方法二:使用线性扫描法(迭代法)
使用两个变量,一个用来保存当前元素的下标,另一个用来保存之前遍历过的元素中与目标值相减的结果的下标。当我们遍历数组时,我们会更新这个差值下标,如果当前元素的值正好等于差值,那么我们就找到了答案。
详细代码如下:(Java实现)
package com.mobai.study0304;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/**
*给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
* 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现
* 示例:
* 给定 nums = [2, 7, 11, 15], target = 9
* 因为 nums[0] + nums[1] = 2 + 7 = 9
* 所以返回 [0, 1]
* 本题有两种解法:
* 方法一:使用HushMap
* 方法二:使用迭代法
* @Author Mobai
* @Date 2024/3/4 18:41
* @Version 1.0
*/
public class Test {
public static void main(String[] args) {
int[] arr={2,7,11,15};
int target=26;
int[] newArr;
//使用HushMap
//newArr =hushTest(arr,target);
//使用迭代法实现
newArr=ArrayTest(arr,target);
if (newArr!=null){
Arrays.stream(newArr).forEach(System.out::println);
}else{
System.out.println("没有符合要求的数");
}
}
/**
* 使用Hush表实现
* @param arr 传入一个int类型数组,表示待查序列
* @param target 传入一个int类型变量表示两数之和
* @return 查到了返回一个数组存放两个数的下标,否则返回null
* @Author Mobai
* @Date 2024/3/4 18:41
* @Version 1.0
*/
public static int[] hushTest(int[] arr,int target){
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < arr.length; i++) {
int num = target - arr[i];
if (map.containsKey(num)) {
return new int[]{map.get(num), i};
}
map.put(arr[i], i);
}
return null;
}
/**
* 使用迭代法实现
* @param arr 传入一个int类型数组,表示待查序列
* @param target 传入一个int类型变量表示两数之和
* @return 查到了返回一个数组存放两个数的下标,否则返回null
* @Author Mobai
* @Date 2024/3/4 18:41
* @Version 1.0
*/
public static int[] ArrayTest(int[] arr, int target) {
int[] result = new int[2]; // 用于保存结果的数组
for (int i = 0; i < arr.length; i++) {
// 计算当前元素与目标值的差值
int num = target - arr[i];
// 从当前元素的下一个位置开始向前搜索差值
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] == num) {
// 如果找到了差值,保存下标并返回结果
result[0] = i;
result[1] = j;
return result;
}
}
}
return null;
}
}