• 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,即可。

    四、题解
    1. class Solution {
    2. public int[] twoSum(int[] nums, int target) {
    3. Map<Integer, Integer> map = new HashMap<>();
    4. for(int i = 0; i< nums.length; i++) {
    5. if(map.containsKey(target - nums[i])) {
    6. return new int[] {map.get(target-nums[i]),i};
    7. }
    8. map.put(nums[i], i);
    9. }
    10. throw new IllegalArgumentException("没有两数和为:"+target);
    11. }
    12. }

  • 相关阅读:
    k8s学习-DaemonSet(模板、创建、更新、回滚、删除等)
    Python图像处理库Pillow(PIL)的简单使用
    MySQL — VARCHAR 长度截断问题
    003-CSS-斑马线&棋盘效果
    快鲸智慧楼宇:提供物业管理综合方案,实现物业收益最大化
    [项目管理-24]:非暴力沟通的本质就是:”用大家都舒服的方式解决问题“
    #21天学习挑战赛—深度学习实战100例#——乳腺癌识别
    互联网简史-分久必合,合久必分
    在Linux上部署Servlet程序
    Redis是什么
  • 原文地址:https://blog.csdn.net/lyhizjj/article/details/133562547