【LeetCode1】两数之和_哈希表
一、题目
给定一个整数数组 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】两数之和_哈希表相关推荐
- LeetCode-1.两数之和(哈希表)
题目内容 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/two-sum 给定一个整数数组 nums 和一个整数目标值 target,请你在该数 ...
- 算法动画图解:两数之和(哈希表)
更多算法动画图解,长按此链接跳转AppStore 动画 算法动画图解:两数之和(哈希表) 思路 哈希表map用来保存一个数,另一个数在遍历nums的时候和map中的数尝试求和是否为target,如果求 ...
- LeetCode 1. 两数之和【哈希表】
1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标. 你可以假设每种输入只会对应一个答案 ...
- 两数之和(LeetCode)——哈希表法(C语言)
上一篇文章留了个引子--用"哈希表"法来解决这个问题. 今天,我们来解决一下.为什么用哈希表法?很简单因为它--快! 讲解之前我们先来提出几个问题? 1)什么是"哈希表& ...
- 01两数之和(哈希表)
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组中同一 ...
- 用js实现两数之和(哈希表)
题目: 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值target 的那两个整数,并返回它们的数组下标.你可以假设每种输入只会对应一个答案 ...
- 1.两数之和(哈希表)
[题目] 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标. 你可以假设每种输入只会对应一个答案.但是 ...
- 力扣1. 两数之和(哈希表,JavaScript)
var twoSum = function(nums, target) {let map=new Map()for(let x=0;x<nums.length;x++){if(map.has(t ...
- 从leetcode1. 两数之和循序渐进(双指针,BST,哈希表)
leetcode1. 两数之和 1.之前只知道桶排序那种标志数组,所以看到第一眼就想到那个方面去了.但在本题数组里面存储某个数出现的次数对该题是没有意义的,应该存储某个数出现的位置. 2.哈希表是优化 ...
最新文章
- 创 keras_contrib 安装
- MySQL Access denied错误的缘故情由
- The Intelligent Investor Feedback
- Java-IntelliJ IDEA【@Override is not allowed when implementing interface method 解决方法】
- [翻译]Review——How JavaScript works:The building blocks of Web Workers
- AZPR3.0的脱壳教程.
- 软考中级-软件设计师|下午题攻略
- B站黑马Java基础+就业班+各种项目idea版本(正在更新)4测试 反射 注解
- 小米手机开启开发者模式以及INSTALL_FAILED_USER_RESTRICTED报错处理
- 《霍比特人2》:我靠,洞里有条好大的龙!!!
- 如何缓解自己紧张焦虑的情绪?
- 在计算机术语中只读存储器常用,计算机应用基础复习题.doc
- 人工智能相关技术的快速发展,主要带来了哪些价值优势?
- 国仁网络资讯:抖音被降权、限流、警告了怎么办;触碰了抖音哪些违规行为。
- uniapp入门学习
- Android HIDL HAL 接口定义语言详解
- IDM Internet Download Manager 无法下载此文件 问题
- 愤怒是可以控制的,火爆脾气也是可以改变的,关键在于掌握方法。
- Matlab绘图基本——局部放大图
- ehcache 自定义序列化
热门文章
- [RTL-SDR] RTL-SDR原理图
- 用计算机弹出娃娃脸,在windows xp中释放隐藏网速
- 【乐理】音程和半音数
- MEC硬件加速技术分析
- 操作系统 MIT JOS lab4 超详细过程,附已通过代码
- tranmac不能识别_TransMac下载_TransMac为什么无法识别安装盘
- 女人入洞房那天以后!!
- 深信服防火墙配置详细步骤(防火墙的基本配置方法)
- 第984期机器学习日报(2017-05-29)
- linux 网卡天启与关闭,在Gnome Shell中切换到黑暗模式(Dark Mode)的方法