思路讲解与算法实现 LeetCode - 两数之和

举报
陈皮的JavaLib 发表于 2021/06/09 23:15:09 2021/06/09
【摘要】 每天一道公司算法真题,讲解解题思路与各种算法实现;欢迎大家点评或者说出你的解题想法,或评论想让我讲解哪道题! 目录 题目思路算法实现上下篇 题目 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使...

每天一道公司算法真题,讲解解题思路与各种算法实现;欢迎大家点评或者说出你的解题想法,或评论想让我讲解哪道题!

题目

给定一个整数数组 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莫属了。

算法步骤:

  1. 遍历数组每一个数num,通过 target-num 计算出另一个加数A;
  2. 在map中查找key是否等于A的值,如果存在,则返回当前数的下标和A的下标;
  3. 如果不存在,则将此数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执行结果:
在这里插入图片描述

上下篇

下一篇思路讲解与算法实现 LeetCode - 两数相加

文章来源: javalib.blog.csdn.net,作者:陈皮的JavaLib,版权归原作者所有,如需转载,请联系作者。

原文链接:javalib.blog.csdn.net/article/details/112974915

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。