一、题目

给定一个整数数组 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]

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/two-sum

二、基于哈希表的算法

算法描述

  • 在遍历数组的时候,就把键值对信息放入哈希表中,并在这个哈希表中查找target-num[i],一旦查找出来,说明要找的两个数就存在于这个数组中。

1、定义哈希表

struct hashTable {int key;int val;UT_hash_handle hh;
};

UT_hash_handle表示结构体类型为哈希表

2、查找哈希表中是否存在某值

struct hashTable* find(int ikey) {struct hashTable* tmp;HASH_FIND_INT(hashtable, &ikey, tmp);return tmp;
}

HASH_FIND_INT,第一个参数哈希表指针,第二个参数是键值的地址,第三个参数是输出的哈希表指针。当可以在哈希表中找到相应键值时,其返回给定键的结构,当找不到时返回NULL。

3、向哈希表中插入键值对

void insert(int ikey, int ival) {struct hashTable* it = find(ikey);if (it == NULL) {struct hashTable* tmp = malloc(sizeof(struct hashTable));tmp->key = ikey, tmp->val = ival;HASH_ADD_INT(hashtable, key, tmp);} else {it->val = ival;}
}

如果要查找的键值不存在的话,就向哈希表中插入该键值对,否则更新键值的下标

4、用哈希表匹配数组的两个数

int* twoSum(int* nums, int numsSize, int target, int* returnSize) {hashtable = NULL;for (int i = 0; i < numsSize; i++) {struct hashTable* it = find(target - nums[i]);if (it != NULL) {int* ret = malloc(sizeof(int) * 2);ret[0] = it->val, ret[1] = i;*returnSize = 2;return ret;}insert(nums[i], i);}*returnSize = 0;return NULL;
}

比如,两数之和为9,在数组

1 3 5 6 9 2

  • 9-1=8,向哈希表中查找8,NULL,把1对应的键值对放入哈希表中
  • 9-3=6,向哈希表中查找6,NULL,把3对应的键值对放入哈希表中
  • 9-5=4,向哈希表中查找4,NULL,把5对应的键值对放入哈希表中
  • 9-6=3,向哈希表中查找3,哈希表中存在3,返回下标信息

5、完整代码

struct hashTable {int key;int val;UT_hash_handle hh;
};struct hashTable* hashtable;struct hashTable* find(int ikey) {struct hashTable* tmp;HASH_FIND_INT(hashtable, &ikey, tmp);return tmp;
}void insert(int ikey, int ival) {struct hashTable* it = find(ikey);if (it == NULL) {struct hashTable* tmp = malloc(sizeof(struct hashTable));tmp->key = ikey, tmp->val = ival;HASH_ADD_INT(hashtable, key, tmp);} else {it->val = ival;}
}int* twoSum(int* nums, int numsSize, int target, int* returnSize) {hashtable = NULL;for (int i = 0; i < numsSize; i++) {struct hashTable* it = find(target - nums[i]);if (it != NULL) {int* ret = malloc(sizeof(int) * 2);ret[0] = it->val, ret[1] = i;*returnSize = 2;return ret;}insert(nums[i], i);}*returnSize = 0;return NULL;
}作者:LeetCode-Solution
链接:https://leetcode.cn/problems/two-sum/solution/liang-shu-zhi-he-by-leetcode-solution/
来源:力扣(LeetCode)

6、复杂度

  • 时间复杂度O(n)。相比于暴力算法的两个for,利用哈希表直接将O(n)降为O(1)
  • 空间复杂度O(n)。主要为哈希表的开销。

【LeetCode1】两数之和_哈希表相关推荐

  1. LeetCode-1.两数之和(哈希表)

    题目内容 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/two-sum 给定一个整数数组 nums 和一个整数目标值 target,请你在该数 ...

  2. 算法动画图解:两数之和(哈希表)

    更多算法动画图解,长按此链接跳转AppStore 动画 算法动画图解:两数之和(哈希表) 思路 哈希表map用来保存一个数,另一个数在遍历nums的时候和map中的数尝试求和是否为target,如果求 ...

  3. LeetCode 1. 两数之和【哈希表】

    1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标. 你可以假设每种输入只会对应一个答案 ...

  4. 两数之和(LeetCode)——哈希表法(C语言)

    上一篇文章留了个引子--用"哈希表"法来解决这个问题. 今天,我们来解决一下.为什么用哈希表法?很简单因为它--快! 讲解之前我们先来提出几个问题? 1)什么是"哈希表& ...

  5. 01两数之和(哈希表)

    给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组中同一 ...

  6. 用js实现两数之和(哈希表)

    题目:         给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值target  的那两个整数,并返回它们的数组下标.你可以假设每种输入只会对应一个答案 ...

  7. 1.两数之和(哈希表)

    [题目] 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标. 你可以假设每种输入只会对应一个答案.但是 ...

  8. 力扣1. 两数之和(哈希表,JavaScript)

    var twoSum = function(nums, target) {let map=new Map()for(let x=0;x<nums.length;x++){if(map.has(t ...

  9. 从leetcode1. 两数之和循序渐进(双指针,BST,哈希表)

    leetcode1. 两数之和 1.之前只知道桶排序那种标志数组,所以看到第一眼就想到那个方面去了.但在本题数组里面存储某个数出现的次数对该题是没有意义的,应该存储某个数出现的位置. 2.哈希表是优化 ...

最新文章

  1. 创 keras_contrib 安装
  2. MySQL Access denied错误的缘故情由
  3. The Intelligent Investor Feedback
  4. Java-IntelliJ IDEA【@Override is not allowed when implementing interface method 解决方法】
  5. [翻译]Review——How JavaScript works:The building blocks of Web Workers
  6. AZPR3.0的脱壳教程.
  7. 软考中级-软件设计师|下午题攻略
  8. B站黑马Java基础+就业班+各种项目idea版本(正在更新)4测试 反射 注解
  9. 小米手机开启开发者模式以及INSTALL_FAILED_USER_RESTRICTED报错处理
  10. 《霍比特人2》:我靠,洞里有条好大的龙!!!
  11. 如何缓解自己紧张焦虑的情绪?
  12. 在计算机术语中只读存储器常用,计算机应用基础复习题.doc
  13. 人工智能相关技术的快速发展,主要带来了哪些价值优势?
  14. 国仁网络资讯:抖音被降权、限流、警告了怎么办;触碰了抖音哪些违规行为。
  15. uniapp入门学习
  16. Android HIDL HAL 接口定义语言详解
  17. IDM Internet Download Manager 无法下载此文件 问题
  18. 愤怒是可以控制的,火爆脾气也是可以改变的,关键在于掌握方法。
  19. Matlab绘图基本——局部放大图
  20. ehcache 自定义序列化

热门文章

  1. [RTL-SDR] RTL-SDR原理图
  2. 用计算机弹出娃娃脸,在windows xp中释放隐藏网速
  3. 【乐理】音程和半音数
  4. MEC硬件加速技术分析
  5. 操作系统 MIT JOS lab4 超详细过程,附已通过代码
  6. tranmac不能识别_TransMac下载_TransMac为什么无法识别安装盘
  7. 女人入洞房那天以后!!
  8. 深信服防火墙配置详细步骤(防火墙的基本配置方法)
  9. 第984期机器学习日报(2017-05-29)
  10. linux 网卡天启与关闭,在Gnome Shell中切换到黑暗模式(Dark Mode)的方法