LetCode之热题100.1——哈希(两数之和)

本着提升技能,并为蓝桥杯做准备的想法,题解语言采用java,编码环境使用eclipse。

更加建议大家读懂算法思想,而不是单纯的copy代码

一、题目描述

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 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]

提示:

  • 2 <= nums.length <= 104
  • -109 <= nums[i] <= 109
  • -109 <= target <= 109
  • 只会存在一个有效答案
三、题目思路

1.首先最简单的,暴力求解,挨个循环,时间复杂度为O(n2),正常应该都会,不再赘述;

2.哈希求解。首先我们来了解一下Hashmap这个东西:

HashMap(哈希映射)是一种常见的数据结构,它用于存储键值对(key-value pairs)并提供快速的数据访问。它通过将键(key)映射到值(value)的方式来存储数据,这样可以根据键来快速查找相应的值,而无需遍历整个数据集。

无需遍历整个数据集!!!

(下面是 HashMap 查找的基本过程:

  1. 当向 HashMap 中添加键值对时,系统会首先使用哈希函数计算键的哈希码(hash code)。

  2. 哈希码是一个整数,它代表了键在哈希表中的理想存储位置。

  3. 使用哈希码作为索引,HashMap 将键值对存储在对应的位置上。如果多个键具有相同的哈希码,它们可能会被存储在同一个位置上,这就形成了所谓的哈希冲突。

  4. 当需要查找某个键对应的值时,HashMap 会再次计算键的哈希码。

  5. 使用哈希码作为索引,HashMap 将在相应位置上查找对应的值。

  6. 如果存在哈希冲突,也就是多个键具有相同的哈希码,HashMap 会使用一些额外的数据结构(例如链表或红黑树)来存储这些键值对,然后在这个数据结构中进行查找。)

通过使用哈希查找,HashMap 能够在大多数情况下以非常高效的方式查找键值对。然而,在极端情况下,例如哈希冲突非常频繁的情况下,性能可能会下降,因此在设计 HashMap 时需要考虑哈希函数的选择和冲突解决策略。

重点,哈希查找的时间复杂度为O(1);

下面是HashMap的简单使用:

HashMap 是一种常用的数据结构,它提供了许多常用的函数和方法,用于操作和管理键值对数据。以下是一些 HashMap 的常用函数和方法:

  1. put(key, value):向 HashMap 中添加一个键值对,如果键已存在,则替换其对应的值。

  2. get(key):根据键查找对应的值。如果键不存在,则返回 null。

  3. remove(key):根据键删除对应的键值对。

  4. containsKey(key):检查 HashMap 中是否包含指定的键。返回 true 表示存在,返回 false 表示不存在。

  5. containsValue(value):检查 HashMap 中是否包含指定的值。返回 true 表示存在,返回 false 表示不存在。

  6. size():返回 HashMap 中键值对的数量。

  7. isEmpty():检查 HashMap 是否为空。如果没有任何键值对,返回 true,否则返回 false。

  8. keySet():返回包含所有键的 Set 集合。

  9. values():返回包含所有值的集合。

  10. entrySet():返回包含所有键值对的 Set 集合。

  11. clear():清空 HashMap,删除所有键值对。

  12. putAll(map):将另一个 Map 中的所有键值对添加到当前 HashMap 中。

所以,对于此题,我们只需遍历整个数组,首先查找HashMap中是否有自己想要的Value值,如果有则结束循环,如果没有,则将该数加入HashMash,即可。

四、题解
class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> map = new HashMap<>();
        for(int i = 0; i< nums.length; i++) {
            if(map.containsKey(target - nums[i])) {
                return new int[] {map.get(target-nums[i]),i};
            }
            map.put(nums[i], i);
        }
        throw new IllegalArgumentException("没有两数和为:"+target);
    }
}
相关推荐
带多刺的玫瑰1 小时前
Leecode刷题C语言之统计不是特殊数字的数字数量
java·c语言·算法
爱敲代码的憨仔1 小时前
《线性代数的本质》
线性代数·算法·决策树
熬夜学编程的小王1 小时前
【C++篇】深度解析 C++ List 容器:底层设计与实现揭秘
开发语言·数据结构·c++·stl·list
yigan_Eins1 小时前
【数论】莫比乌斯函数及其反演
c++·经验分享·算法
阿史大杯茶1 小时前
AtCoder Beginner Contest 381(ABCDEF 题)视频讲解
数据结构·c++·算法
Chris _data2 小时前
二叉树oj题解析
java·数据结构
დ旧言~2 小时前
【高阶数据结构】图论
算法·深度优先·广度优先·宽度优先·推荐算法
张彦峰ZYF2 小时前
投资策略规划最优决策分析
分布式·算法·金融
The_Ticker2 小时前
CFD平台如何接入实时行情源
java·大数据·数据库·人工智能·算法·区块链·软件工程
Lenyiin3 小时前
02.06、回文链表
数据结构·leetcode·链表