| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 【透过算法了解编程】之两数之和 -> 正文阅读 |
|
[数据结构与算法]【透过算法了解编程】之两数之和 |
介绍:大家好,我是猿码叔叔,很高兴又和大家见面了。 细数进入 Java 领域这几年,可谓一波三折,体会过求职与加班的心酸之后,也渐渐的开始学会将行业与自身职业素养联系起来,去思考如何做自己的职业规划。 技术似乎永远也是一个解不开的谜底,无论你怎么赴汤蹈火,最终都只有一个归宿,那就是家庭。所以啰嗦一句,我们学习技术,热爱技术最终都是为了有一个好的家庭。 正题:今天要写的算法是力扣中的第一道题《两数之和》。 难度:容易 题目内容:
题目来源:力扣 💡分析:根据题意,假设: + ?== , 则有?-? == ?, ??-? ==??? 因此,最简单的办法就是全局搜索。我们分别创建 2 个 循环。?代表 ,? ??代表 ??,这样一来我们将两个循环的当前下标元素进行相加,如果等于 ,就按照题目要求的方式返回即可,反之继续遍历。由于题目中强调,数组 ?中一定会有一对满足要求的数对,且答案只有一个。因此我们不用担心是否有别的答案会出现,或者没有答案的情况。 ?我们先用简单的方式实现一下,代码如下:
时间复杂度:, 为输入数组中元素的数量 空间复杂度: 💡 思考这道题,很容易引人思考的一点是,当我们假设 ?为减数时,必然能根据假设获取到差值,因此我们可以用空间来换时间,使用 hash 来解题。当然,这里我不使用 HashMap,因为 HashMap 是一个封装的散列表,底层也会使用数组扩容机制来 hash 数据,因此我们来学习一下 数组 hash。但前提是 ? 尽可能的小,且大于 。 假设: ; 为了降低时间复杂度,我们必须尽可能少的去对 nums 进行全局搜索。而且我们知道, 最多为 1000,因此我们使用 ?本身作为 hash 值(索引),能快速定位到其是否存在。初始化的数组,元素都会为 0。 设数组:;? 若???> 0,说明该差值存在。 下面是代码实现:
时间复杂度:, 为输入数组中元素的数量 空间复杂度:
大家可以尝试自己去用 HashMap 实现,与写法 2 差不多。 🎓 总结:这道题,可以很好的作为理解 hash?实现原理的辅助,同时也颠覆我们对数组查询效率较低的认知,也渗透出算法为解决诸多难题要面对的最大困难之一 —— 搜索。比如 Elasticsearch就用到了 D-Gap 索引算法,来压缩文档编号,达到空间压缩的作用。可能这些效率上的提升是细微的,但对于庞大的数据量来说,足够了。算法之所以区别于一般的程序,我个人认为它更多的是以效率为导向,来快速解决问题。 学习点:
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 18:28:09- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |