【算法】哈希表 ( 两数之和 )
算法 系列博客
【算法】刷题范围建议 和 代码规范
【算法】复杂度理论 ( 时间复杂度 )
【字符串】最长回文子串 ( 蛮力算法 )
【字符串】最长回文子串 ( 中心线枚举算法 )
【字符串】最长回文子串 ( 动态规划算法 ) ★
【字符串】字符串查找 ( 蛮力算法 )
【字符串】字符串查找 ( Rabin-Karp 算法 )
【算法】双指针算法 ( 双指针算法分类 | 相向双指针 | 有效回文串 )
【算法】双指针算法 ( 有效回文串 II )
【算法】哈希表 ( 两数之和 )
文章目录
- 算法 系列博客
- 一、两数之和
使用哈希表解决问题 , 一般不需要手动实现哈希表 , 一般使用 HashSet 或 HashMap 即可 ;
一、两数之和
两数之和 : https://www.lintcode.com/problem/56/
给定一个未排序的数组 , 找到数组中的两个元素之和 , 等于给定的 target 值 ;
该问题最直观的解法 , 就是 蛮力算法 ;
如 : 给定数组 [6, 4, 2, 9] , 给定 target 值为 10 , 找出数组中哪两个元素之和为 10 ;
如果使用蛮力算法 , 就是遍历所有的数组元素 , 如 遍历 6 , target ( = 10 )减去该被遍历的元素 , 结果是 4 , 然后检测 4 在不在数组中 ;
这样需要设计 两层循环 , 外层循环遍历数组元素 , 内层循环遍历 target - 数组元素 值是否在数组中 ;
上述算法事件复杂度为 O(n2)O(n^2)O(n2) ;
这里的内层循环中 , 检测一个数字是否在数组中 , 可以使用 哈希表 进行实现 , 哈希表查询的单次操作的时间复杂度是 O(1)O(1)O(1) , nnn 次查询的操作是 O(n)O(n)O(n) ;
哈希表在该算法中 , 既不是输入 , 也不是输出 , 是算法计算过程中的耗费 , 因此其空间复杂度是 O(n)O(n)O(n) ;
哈希表的 时间复杂度是 O(n)O(n)O(n) , 空间复杂度是 O(n)O(n)O(n) ;
哈希表存使用 HashMap 集合体现 ;
设计一个循环 , 遍历数组元素 number ; 遍历时检测 target - number 是否在HashMap中 , 如果不在 , 则加入到哈希表中 ;
将 target - number 的值作为 HashMap 集合的 Key 键 , 将该 number 的索引作为 Value 值 ;
上述操作 , 一边遍历 , 一边将数组元素插入到哈希表中 , [3, 6, 2, 4] , 在遍历到 6 时 , 从哈希表中查找 10 - 6 = 4 这个值 , 哈希表中没有 4 , 但此时将 4=2 键值对 插入了 HashMap , 在之后遍历 4 时 , 肯定能找到索引值 2 ;
按照这种遍历方式 , 如果存在这两个元素 , 总能在 O(n)O(n)O(n) 时间内找到两个值
代码示例 :
import java.util.HashMap;class Solution {public int[] twoSum(int[] numbers, int target) {// 键存放 target - numbers[i], 值存放对应的 i 索引值// 如果正在遍历的 numbers[j], 恰好等于某个 target - numbers[i]// 说明 i, j 就是要找的两个索引值HashMap<Integer, Integer> hashMap = new HashMap<>();// 要返回的值int[] result = new int[2];for (int i = 0; i < numbers.length; i++) {if (hashMap.get(numbers[i]) != null) {// 如果集合中有该值, 说明已经找到了两数之和为 target 的两个元素了, 可以直接返回result[0] = hashMap.get(numbers[i]);result[1] = i;return result;}// 向哈希表中存储 target - numbers[i]hashMap.put(target - numbers[i], i);}return result;}
}class Main {public static void main(String[] args) {System.out.println(new Solution().twoSum(new int[]{1,2,4,6}, 10));}
}
【算法】哈希表 ( 两数之和 )相关推荐
- 算法动画图解:两数之和(哈希表)
更多算法动画图解,长按此链接跳转AppStore 动画 算法动画图解:两数之和(哈希表) 思路 哈希表map用来保存一个数,另一个数在遍历nums的时候和map中的数尝试求和是否为target,如果求 ...
- 【算法-初级-数组】两数之和(JavaScript实现)
[算法-初级-数组]两数之和(JavaScript实现) 博客说明 文章所涉及的部分资料来自互联网整理,当然还有自己个人的总结和看法,分享的目的在于共建社区和巩固自己.引用的资料如有侵权,请联系本人删 ...
- C# 算法题系列(一) 两数之和、无重复字符的最长子串
题目一 原题链接 https://leetcode-cn.com/problems/two-sum/ 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整 ...
- 代码随想录哈希表——四数之和
题目 题意:给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等 ...
- (哈希)两数之和(leetcode 1)
1.题目 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标. 你可以假设每种输入只会对应一个答案.但是, ...
- python【力扣LeetCode算法题库】—两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元 ...
- 两数之和(Two Sum)
文章目录 题目 一.暴力算法 二.利用hashMap键的唯一性 题目 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回 ...
- 算法训练Day6 | LeetCode:242. 有效的字母异位词(数组作哈希表);349. 两个数组的交集(Set作哈希表);202.快乐数 (Set作哈希表);1. 两数之和(Map作哈希表)
目录 LeetCode242. 有效的字母异位词 方法:数组作哈希表 1. 思路 2. 代码实现 3. 复杂度分析 4. 思考 Leetcode349. 两个数组的交集 方法一:用Set作HashMa ...
- Two Sum (两数之和) - Hash Table (哈希表)
Two Sum (两数之和) - Hash Table (哈希表) https://leetcode-cn.com/problems/two-sum/ Given an array of intege ...
最新文章
- 寻找隐形冠军 支付宝、微信用得那么溜,可谁知道背后有一名“上海功臣
- PBio-2018:如何设计可预测植物表型的微生物组
- boost::signals2模块实现为类定义预析构函数的最小示例的测试程序
- VTK:Snippets之SaveSceneToFieldData
- 1452.接水问题(思维)
- vue 项目的I18n国际化之路
- Sql Server 部署SSIS包完成远程数据传输
- sqllite开发安卓项目_苹果安卓合作了?两大巨头共同居然共同开发这个项目
- 第九次作业(杨辉三角)
- 不同机器,打印速度相差巨大
- 群接龙,JK上报一键化手机脚本autojs
- Sqlmap常用命令总结及注入实战(Access、mysql)
- matlab lte rsrp,为什么选择 FieldFox 手持式分析仪?- 更宽带宽,更高精度
- arcgis 经纬度转大地坐标_ArcGIS的地理坐标系与大地坐标系
- android 模拟器 启动,android开发之启动模拟器并安装游戏apk
- 基于VBA实现Excel十字交叉高亮显示
- 阵列麦克风声音定位-代码python实现-二维与三维声音定位
- 环境变量的作用,为什么要设置环境变量?
- 2022年上半年,产品经理的55条心得总结!
- Android 容联云IM集成:初始化与登录中的坑