思路讲解与算法实现 LeetCode - 两数之和
每天一道公司算法真题,讲解解题思路与各种算法实现;欢迎大家点评或者说出你的解题想法,或评论想让我讲解哪道题!
题目
给定一个整数数组 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)
链接:https://leetcode-cn.com/problems/two-sum
思路
众所周知,两数之和,即
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))); }
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
输出结果:
[2, 4]
- 1
Leetcode执行结果:
上下篇
文章来源: javalib.blog.csdn.net,作者:陈皮的JavaLib,版权归原作者所有,如需转载,请联系作者。
原文链接:javalib.blog.csdn.net/article/details/112974915
- 点赞
- 收藏
- 关注作者
评论(0)