刷题看力扣,刷了两个月 leetcode 算法,顺利拿下百度、阿里等大厂的 offer

news2024/9/27 15:23:04

随着互联网寒潮的到来, 越来越多的互联网公司提高了面试的难度,其中之一就是加大了面试当中手撕算法题的比例。这里说的算法题不是深度学习,机器学习这类的算法,而是排序,广度优先,动态规划这类既考核数据结构也考核编程能力的题目。刷题的网址非常的多,其中以 leetcode 是最为出名的。

在刷题上,我花了大量的时间,蹚了许多的坑,总结了一下,主要有这三个问题:

  1. 刷过的题老是忘,第二次刷的时候还是不会做

  2. 刷题的速度很慢,即使花一天时间,也常常只能刷五六道

  3. 坚持不下来,老是刷到一半就停滞下来了,当我第二次再来刷的时候,前面刷过的题都又忘的差不多

说出来都是泪,感觉刷题这个路是真的难走,花了很多时间,但是感觉没有什么收获。所以最近我一直在反思自己刷题的方法,希望能够提高刷题的效率和速度。当我总结了以下方法以后,我很明显的感受到自己的刷题速度从以前周末的一天五六道提升到周末一天刷十五六道以上,速度相比以前提升的非常明显。

本文采用 Java 语言来进行描述,帮大家好好梳理一下数据结构与算法,在工作和面试中用的上。亦即总结常见的的数据结构,以及在 Java 中相应的实现方法,务求理论与实践一步总结到位。

常用数据结构

数组

数组是相同数据类型的元素按一定顺序排列的集合,是一块连续的内存空间。数组的优点是:get 和 set 操作时间上都是 O(1)的;缺点是:add 和 remove 操作时间上都是 O(N)的。

Java 中,Array 就是数组,此外,ArrayList 使用了数组 Array 作为其实现基础,它和一般的 Array 相比,最大的好处是,我们在添加元素时不必考虑越界,元素超出数组容量时,它会自动扩张保证容量。

Vector 和 ArrayList 相比,主要差别就在于多了一个线程安全性,但是效率比较低下。如今 java.util.concurrent 包提供了许多线程安全的集合类(比如 LinkedBlockingQueue),所以不必再使用 Vector 了。

链表

链表是一种非连续、非顺序的结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的,链表由一系列结点组成。链表的优点是:add 和 remove 操作时间上都是 O(1)的;缺点是:get 和 set 操作时间上都是 O(N)的,而且需要额外的空间存储指向其他数据地址的项。

查找操作对于未排序的数组和链表时间上都是 O(N)。

队列

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端进行删除操作,而在表的后端进行插入操作,亦即所谓的先进先出(FIFO)。

Java 中,LinkedList 实现了 Deque,可以做为双向队列(自然也可以用作单向队列)。另外 PriorityQueue 实现了带优先级的队列,亦即队列的每一个元素都有优先级,且元素按照优先级排序。

栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。它体现了后进先出(LIFO)的特点。

Java 中,Stack 实现了这种特性,但是 Stack 也继承了 Vector,所以具有线程安全线和效率低下两个特性,最新的 JDK8 中,推荐用 Deque 来实现栈。

集合

集合是指具有某种特定性质的具体的或抽象的对象汇总成的集体,这些对象称为该集合的元素,其主要特性是元素不可重复。

在 Java 中,HashSet 体现了这种数据结构,而 HashSet 是在 MashMap 的基础上构建的。LinkedHashSet 继承了 HashSet,使用 HashCode 确定在集合中的位置,使用链表的方式确定位置,所以有顺序。TreeSet 实现了 SortedSet 接口,是排好序的集合(在 TreeMap 基础之上构建),因此查找操作比普通的 Hashset 要快(log(N));插入操作要慢(log(N)),因为要维护有序。

散列表

散列表也叫哈希表,是根据关键键值(Keyvalue)进行访问的数据结构,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度,这个映射函数叫做散列函数。

Java 中 HashMap 实现了散列表,而 Hashtable 比它多了一个线程安全性,但是由于使用了全局锁导致其性能较低,所以现在一般用 ConcurrentHashMap 来实现线程安全的 HashMap(类似的,以上的数据结构在最新的 java.util.concurrent 的包中几乎都有对应的高性能的线程安全的类)。TreeMap 实现 SortMap 接口,能够把它保存的记录按照键排序。LinkedHashMap 保留了元素插入的顺序。WeakHashMap 是一种改进的 HashMap,它对 key 实行“弱引用”,如果一个 key 不再被外部所引用,那么该 key 可以被 GC 回收,而不需要我们手动删除。

树(tree)是包含 n(n>0)个节点的有穷集合,其中:

  • 每个元素称为节点(node)

  • 有一个特定的节点被称为根节点或树根(root)

  • 除根节点之外的其余数据元素被分为 m(m≥0)个互不相交的结合 T1,T2,……Tm-1,其中每一个集合 Ti(1<=i<=m)本身也是一棵树,被称作原树的子树(subtree)

树这种数据结构在计算机世界中有广泛的应用,比如操作系统中用到了红黑树,数据库用到了 B+树,编译器中的语法树,内存管理用到了堆(本质上也是树),信息论中的哈夫曼编码等等等等,在 Java 中 TreeSet 和 TreeMap 用到了树来排序(二分查找提高检索速度),不过一般都需要程序员自己去定义一个树的类,并实现相关性质,而没有现成的 API。

下面用 Java 来实现各种常见的树。

二叉树

二叉树是一种基础而且重要的数据结构,其每个结点至多只有二棵子树,二叉树有左右子树之分,第 i 层至多有 2(i-1)个结点(i 从 1 开始);深度为 k 的二叉树至多有 2(k)-1)个结点,对任何一棵二叉树,如果其终端结点数为 n0,度为 2 的结点数为 n2,则 n0=n2+1。

二叉树的性质:

  • 在非空二叉树中,第 i 层的结点总数不超过 2^(i-1), i>=1;

  • 深度为 h 的二叉树最多有 2^h-1 个结点(h>=1),最少有 h 个结点;

  • 对于任意一棵二叉树,如果其叶结点数为 N0,而度数为 2 的结点总数为 N2,则 N0=N2+1;

  • 具有 n 个结点的完全二叉树的深度为 log2(n+1);

  • 有 N 个结点的完全二叉树各结点如果用顺序方式存储,则结点之间有如下关系:若 I 为结点编号则 如果 I>1,则其父结点的编号为 I/2;如果 2I<=N,则其左儿子(即左子树的根结点)的编号为 2I;若 2I>N,则无左儿子;如果 2I+1<=N,则其右儿子的结点编号为 2I+1;若 2I+1>N,则无右儿子。

  • 给定 N 个节点,能构成 h(N)种不同的二叉树,其中 h(N)为卡特兰数的第 N 项,h(n)=C(2*n, n)/(n+1)。

  • 设有 i 个枝点,I 为所有枝点的道路长度总和,J 为叶的道路长度总和 J=I+2i。

满二叉树、完全二叉树

满二叉树:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点;

完全二叉树:若设二叉树的深度为 h,除第 h 层外,其它各层 (1~(h-1)层) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树;

满二叉树是完全二叉树的一个特例。

二叉查找树

二叉查找树,又称为是二叉排序树(Binary Sort Tree)或二叉搜索树。二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:

  • 若左子树不空,则左子树上所有结点的值均小于它的根结点的值;

  • 若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;

  • 左、右子树也分别为二叉排序树;

  • 没有键值相等的节点。

二叉查找树的性质:对二叉查找树进行中序遍历,即可得到有序的数列。二叉查找树的时间复杂度:它和二分查找一样,插入和查找的时间复杂度均为 O(logn),但是在最坏的情况下仍然会有 O(n)的时间复杂度。原因在于插入和删除元素的时候,树没有保持平衡。我们追求的是在最坏的情况下仍然有较好的时间复杂度,这就是平衡二叉树设计的初衷。

平衡二叉树

平衡二叉树又被称为 AVL 树,具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过 1,并且左右两个子树都是一棵平衡二叉树。它的出现就是解决二叉查找树不平衡导致查找效率退化为线性的问题,因为在删除和插入之时会维护树的平衡,使得查找时间保持在 O(logn),比二叉查找树更稳定。

堆是一颗完全二叉树,在这棵树中,所有父节点都满足大于等于其子节点的堆叫大根堆,所有父节点都满足小于等于其子节点的堆叫小根堆。堆虽然是一颗树,但是通常存放在一个数组中,父节点和孩子节点的父子关系通过数组下标来确定。

堆的用途:堆排序,优先级队列。此外由于调整代价较小,也适合实时类型的排序与变更。

最后

写着写着就发现要想总结到位是一项非常庞大的工程,路漫漫其修远兮,吾将上下而求索。

我个人认为,作为技术人就要保持终生学习的态度,让学习力成为核心竞争力,才能不被时代所淘汰,而高效的时间支配能让你变得更加优秀,所以,我在这里将这份耗时两个月搜集的算法刷题,送给有需要的人

《算法的乐趣》

《算法》

《算法刷题 Leetcode 版》

资料已整理成文档,需要获取的小伙伴可以+文末wx名片免费领取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/31500.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《深入浅出Python量化交易实战》:散户也能学会的数字化交易策略

前言 您可能不知道&#xff0c;许多专业的交易机构已经采用设定程序完成自动化交易&#xff0c;通过机器语言&#xff0c;解密盘面的走势&#xff0c;从而实现持续盈利的目的。 &#xff08;文末送读者福利&#xff09; 这并非什么秘密&#xff0c;他们正是借助了这样的数字…

树和二叉树练习题

文章目录一 二叉树的五大性质二 判断题三 填空题四 选择题四 分析求解题五 算法设计题一 二叉树的五大性质 性质一&#xff1a;对于一颗二叉树&#xff0c;第i层的最大结点数量为 2i−12^{i-1} 2i−1 性质二&#xff1a;对于一颗深度为k的二叉树&#xff0c;可以具有的最大结点…

[附源码]SSM计算机毕业设计基于健身房管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

基于残差学习的卷积神经网络图像去噪研究-含Matlab代码

⭕⭕ 目 录 ⭕⭕✳️ 一、引言✳️ 二、深度去噪网络结构设计✳️ 2.1 网络层数的设定✳️ 2.2 残差学习✳️ 2.3 批规范化✳️ 三、实验结果✳️ 3.1 网络训练✳️ 3.2 实验结果比较✳️ 四、参考文献✳️ 五、Matlab代码获取✳️ 一、引言 由于图像去噪问题的退化模型假设比…

如何在确保身份安全的同时改善员工体验

疫情后世界的员工已经告别了传统的工作环境。远程和混合工作是新常态&#xff0c;员工希望即使在远程工作时也能完全访问他们的工作资源。他们还可能使用多个设备&#xff08;甚至是个人设备&#xff09;来访问公司数据。 现代工作环境 — IT 挑战 由于需要考虑的因素特别多&a…

软件测试面试技巧有哪些?可以从这2个方面去进行准备

面试所有只职场人&#xff0c;通往工作岗位的第一道关卡&#xff0c;也是最重要的一道门槛。而面试中&#xff0c;如何回答HR提出的问题很大程度上决定了面试能不能成功。所以这些软件测试的面试技巧你可不能错过了。 首先是自我介绍 自我介绍的时间不能太短&#xff0c;几十秒…

协同过滤算法

文章目录0 前言1. 概念1.2 分类2 基于用户的协同过滤2.1 相似性计算2.1.1 欧氏距离2.1.2 余弦相似度2.1.3 皮尔逊相关系数Pearson2.1.4 杰卡德相似度 Jaccard小结&#xff1a;2.2 结果分数2.3 优缺点分析3 基于物品的协同过滤3.1 结果分数3.2 优缺点分析4 总结4.1 应用场景4.2 …

list的介绍及使用(14)

目录 1、list的介绍 2、list的使用 1、list的构造 2、迭代器 3、list modifiers 4、list element access 5、list capacity 1、list的介绍 1、list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2、list的底层是双…

u盘提示格式化怎么修复?80%的人都在这么做!

u盘是我们平时经常使用的一个存储设备&#xff0c;使用时间久了容易出现格式化的情况&#xff0c;而这种情况一般都会出现在 U盘上。如果出现格式化的提示&#xff0c;u盘提示格式化怎么修复&#xff1f;很多小伙伴们可能都不知道恢复的方法&#xff0c;今天我们就一起来看看&a…

可观测性不止于监控,让运维不开盲盒!

近年来&#xff0c;可观测性热度节节攀升&#xff0c;企业在可观测性实践过程中常常也伴随着一系列棘手的问题&#xff1a; 监控与可观测区别是什么&#xff1f;可观测发展史是怎样的&#xff1f;如何规划可观测的体系化建设之路&#xff1f;如何让可观测平台与工具顺利落地&a…

雷达探测项目仿真代码(Matlab代码实现)

&#x1f352;&#x1f352;&#x1f352;欢迎关注&#x1f308;&#x1f308;&#x1f308; &#x1f4dd;个人主页&#xff1a;我爱Matlab &#x1f44d;点赞➕评论➕收藏 养成习惯&#xff08;一键三连&#xff09;&#x1f33b;&#x1f33b;&#x1f33b; &#x1f34c;希…

用DIV+CSS技术设计的明星个人网站制作(基于HTML+CSS+JavaScript制作明星彭于晏网页)

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

8年研发工程师心路历程(道与术皆得)

序言 首先本人只是一个资质平平对技术不算热衷但终归是它给我赏了一口饭吃心存感激的普通程序员&#xff0c;暂且不要拿作者和专攻技术的高端玩家做对比&#xff0c;因此我介绍的方法也是相对比较温和&#xff0c;保证理论上来说不会占用额外过多的空闲时间去学习。 作为一个程…

给所有的async函数添加try/catch

async 如果不加 try/catch 会发生什么呢&#xff1f;下面让我们看个例子 async function fn() {let value await new Promise((resolve, reject) > reject(报错))console.log(do something...) } fn() 导致浏览器报错&#xff1a;一个未捕获的错误&#xff0c;并且下面的…

Spring定时器会初始化两次终于找到原因了!!!

使用idea编译器中的Tomcat时写在逻辑业务层的定时器会执行两次&#xff0c;最开始我认为是Tomcat的问题&#xff0c;后面做了个测试在出现该现象的业务层类中定义了一个测试定时器方法&#xff1a; Scheduled(cron "0/5 * * * * ?") //每隔5秒执行一次这个方法pub…

华为再次入选2022年Gartner® SIEM魔力象限

近日&#xff0c;全球IT研究与顾问咨询机构Gartner正式发布《Magic Quadrant™ for Security Information and Event Management》报告&#xff0c;全球共有16家厂商入选了Gartner SIEM魔力象限&#xff0c;华为凭借HiSec Insight和华为云安全云脑技术能力进入了Gartner SIEM魔…

javascript中this的指向问题

this的五种绑定问题 1&#xff0c;默认绑定 默认绑定通常是指函数独立调用&#xff0c;不涉及其他绑定规则。 非严格模式下&#xff0c;this指向window严格模式,下&#xff0c;this指向undefined. 在普通函数内部的thislet/const定义的变量存在暂时性死区&#xff0c;而目不…

elk实践

1、背景 鉴于现在项目中的日志比较乱&#xff0c;所以建议使用现在较为流行的elk收集日志并展示&#xff1b; 2、下载、配置与启动 在下载 Elastic 产品 | Elastic 官网下载filebeat、logstash、elasticSearch、kibana 版本要一致 本人测试用的7.14 mac版本 实际生产使用7.14…

甘特图来搞定跨部门协作难的问题!项目经理必备

在很多大的工程项目、IT项目、市场项目中&#xff0c;都会涉及诸多对人员、时间、质量等的控制&#xff0c;这往往需要跨部门协作。但目前大多数企业跨部门协作还是通过微信、口口相传的方式进行&#xff0c;也导致了以下这些问题的频现&#xff1a; 辗转多个群聊提取有用的信息…

笔试强训(三十九)

目录一、选择题二、编程题2.1 字符串计数2.1.1 题目2.1.2 题解一、选择题 &#xff08;1&#xff09;/etc/resolv.conf的用途是&#xff08;C&#xff09; A.邮件服务的配置文件 B.DHCP的设置文件 C.DNS解析的设置文件 D.网络路由的设置文件 &#xff08;2&#xff09;能够pin…