package com.ltj.算法100题.两数之和;
import org.junit.Test;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/**
* @author leitingjun
* @data 2022/9/7 15:19
*/
class Solution {
//给定一个整数数组 nums 和一个整数目标值 target
//请你在该数组中找出 和为目标值 target 的那 两个 整数
//并返回它们的数组下标。
//示例 2:
//输入:nums = [3,2,4], target = 6
//输出:[1,2]
//思路 利用hashmap一边存储数据一边判断 i+存过的数是否=target
//如果等于则返回nums[i]和之前存储value的对应key值
/* public static int[] twoSum(int[] nums, int target) {
Map<Integer,Integer> map=new HashMap<>();
for (int i = 0; i <nums.length ; i++) {
for (int j = 0; j <i ; j++) {
if(target-nums[i]==map.get(j)){
return new int[]{j,i};
}
}
map.put(i,nums[i]);
}
return new int[]{};
}*/
// 优化:
public static int[] twoSum(int[] nums, int target) {
int len = nums.length;
//最多存length-1个数进去,指定开辟空间避免浪费
Map<Integer, Integer> map = new HashMap<>(nums.length - 1);
for (int i = 0; i < nums.length; i++) {
// 利用hashmap中的方法containsValue()和get()
if (map.containsKey(target - nums[i])) {
return new int[]{i, map.get(target - nums[i])
};
}
map.put(nums[i],i);
}
return new int[]{};
}
public static void main(String[] args) {
int target = 6;
int[] nums = new int[]{3, 2, 4};
int[] ints = twoSum(nums, target);
System.out.println(Arrays.toString(ints));
}
}
11-23
4万+
10-11
833