聆听 沉淀 传播 … 关注微信公众号【
陈皮的JavaLib
】,助你放弃编程之路!每天一道算法题,讲解自己解题思路与实现;欢迎大家点评或者说出你的解题想法;也可评论想让我讲解哪道题!
题目
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
你可以按任意顺序返回答案。
示例1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例3:
输入:nums = [3,3], target = 6
输出:[0,1]
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/tw…
一、思路
众所周知,两数之和,即
A+B=SUM
。在已知SUM的情况下,然后又获得一个A时,只需要找到一个数等于SUM-A
。对于一个数组,如果我们采用遍历两两相加的算法,即对于数组的每一个数,都要与其他数进行相加,判断是否等于目标值,这速度是非常慢的,即时间复杂度为O(N²)。
换个角度想,只要遍历过的数和它对应下标,能通过某种规则或者算法(
此规则和算法要简单并且速度要快
)存放起来,后续我们再去查找这个数能快速查出来,那算法速度就大大提高了。这样只需要遍历一遍数组即可,时间复杂度为O(N)。既要存取速度快,还能存对应的数和下标键值对,那就非哈希表
HashMap
莫属了。
算法步骤:
- 遍历数组每一个数num,通过 target-num 计算出另一个加数A;
- 在map中查找key是否等于A的值,如果存在,则返回当前数的下标和A的下标;
- 如果不存在,则将此数num放入map中,key为num,value为num在数组中的下标;
二、算法实现
package com.nobody;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/**
* @Description 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回它们的数组下标。
* 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。 你可以按任意顺序返回答案。
* 原题链接:https://leetcode-cn.com/problems/two-sum/
* @Author Mr.nobody
* @Date 2021/1/21
* @Version 1.0
*/
public class TwoSum {
public static int[] twoSum(int[] nums, int target) {
// 记录每一个遍历过的数,利用HashMap插入查找0(1)的高效率时间复杂度
Map<Integer, Integer> indexMap = new HashMap<>(16);
// 遍历每一个数
for (int index = 0; index < nums.length; index++) {
// target-nums[index]算出另一个加数,然后在map中找有没有这个加数
if (indexMap.get(target - nums[index]) != null) {
// 找到了,就返回2个加数的下标
return new int[] {indexMap.get(target - nums[index]), index};
} else {
// 没找到,就将这个数放入map中,key为这个数,value为这个数的下标
indexMap.put(nums[index], index);
}
}
return null;
}
// 测试
public static void main(String[] args) {
System.out.println(Arrays.toString(twoSum(new int[] {1, 2, 6, 4, 10, 11, 8, 9}, 16)));
}
}
输出结果:
[2, 4]
Leetcode执行结果: