代码随想录刷题|数组、链表的总结

简介: 代码随想录刷题|数组、链表的总结

数组

二分查找(查)

       二分查找的条件:

               1、数组是有序数组

               2、数组中无重复元素(一旦有了重复的数组使用二分法返回的条件就不唯一了)

       二分查找的关键点:

这道题目主要的关键点就在于保持“区间的不变量”,对区间右边的定义决定了要使用左闭右开还是左开右闭。右开就是这个下标对数组有效,右闭就是这个下标对数组无效


       总结:


               对于数组来说,当知道一个元素的下标之后,查询一个数字是很快的,时间复杂度是O(1),一步到位。


               但是如果不知道元素的下标,只知道要查询的元素,这种情况下就只能进行对数组进行遍历,从第一个元素开始查找,进行比较,这个时间复杂度是O(n)


               此时,如果这个数组符合二分查找的条件,那就可是使用二分查找进行操作,一步一步缩小元素可能出现的范围,这个时间复杂度是O(logn),其中n 是数组的长度


移除元素(删)


 数组真是出了通过下标查找元素的时候方便,然后就是干啥都不方便


       这道题目是要删除数组中出现过的目标值元素,如果数组中元素不重复的,我们可以创建一个比原数组长度小于1 的数组,然后将不是目标值的数组移动到新数组中,这样时间复杂度是O(n),空间复杂度是O(n),因为需要开辟一块空间重新进行存储。


       但是这道题目并没有说明元素是不可重复的,而且强调了要删除所有的目标值,这一条就比比较复杂,因为就算创建新数组,你不知道创建多长的,其实也可以整,但就是比较麻烦


       而且这道题目明确要求必须仅使用O(1) 额外空间并原地修改数组,所以要牺牲时间来获取空间,那就使用两重遍历,第一for循环找数,第二for循环移动元素,这样时间复杂度是O(n^2),也就是暴力解法


       因为力扣的输出不用管,但是它会按照你返回的数组长度进行遍历,本质上你的数组长度并没有发生变化,只是你给一个数组长度,它只会遍历输出到这里,所以每删除一个元素要在长度上进行减操作


       此时,有一个思路就很妙了,那就是双指针法,双指针可以说是双层for循环的一种替代,但是通过双指针在不增加空间的情况下来降低时间复杂度。


       一个快指针在前面进行判断,一个慢指针在后面进行收割,这两个指针代表的都是数组的下标


       其实遍历数组的时候,就是在用 i 指针进行遍历,指哪取哪


       这里增加了一个指针,遍历时,i 在前面指,然后 if 进行判断,如果不是我们要查找的目标值,那我就把你保留着,如果不是,我就不鸟你,i 继续。同时慢指针负责记录要返回的数组长度的工作


       总结:

               用好双指针,通过两个指针在一个for循环下完成两个for循环的工作


               双指针在数组、链表、N数之和、字符串 中用起来都很绝:


                       数组:

                               移除元素

                               有序数组的平方

                               长度最小的子数组                      


                       链表:

                               翻转链表

                               删除链表中的倒数第n个元素

                               链表相交

                               环形链表


                       N数之和:

                               三数之和

                               四数之和    


                       字符串:

                               反转字符串

                               替换空格

                               反转字符串里的单词  


有序数组的平方

 首先是数字的平方,这个好办,进行遍历,然后每个元素平方就可以了,麻烦就麻烦在有序上,因为存在负数,我们先平方后,然后再对平方后的数组进行排序就可以了,这是一种暴力的解法,而且用到了java语言特有的工具类

       哪怎么可以在不使用工具类的情况下进行排序呢,就需要我们对得到的新元素进行排序


       其次是有序数组,因为存在负数,其实两头的元素平方下来是最大的

       题目的条件是这是一个递增的数组,而且平方之后的数组也是需要递增的,也就是返回的数组也要是递增的数组,这个条件能有什么用,能做什么文章呢


       哪接下来要考虑的就是怎么比较,怎么排序了

               首先考虑一下,能不能在原数组中进行排序呢?可以,但是会时间复杂度比较高,埋个线(好好了解一下数组的排序问题)

               我们需要的是利用题目的特点进行排序,其实数组中的元素平方后,我们不能马上找到最小的数字,我们最有可能的就是有机会找到最大的数字,那就是要么是第一个元素,要么就是最后一个元素,那就对这两个元素进行比较,将最大的放在数组的末尾,然后小的那个元素进行待命,继续比较


       接下来就是往哪放的问题了

               如果是往原数组中放,会造成数字的丢失,因为从两头进行比较的话,可能有些数字还没比较就被覆盖了

               所以那就开辟一下新的空间存放新的数组,返回的数组要是有序的,我们不能马上找到最小的元素,不能从小到大地放,只能从大到小,所以存放结果的时候,从新数组的最后一位往前放


       总结:


               开辟新的空间存放新数组

               原数组定义两个指针从两边开始进行比较

               将比较出的大的元素依次从新数组的后面往前进行存放


长度最小的子数组

螺旋矩阵||

       数组的模拟,保持区间不变量

总结


二分查找是查,用元素的值查,是有序不重复的数组


       移除元素是删,不开辟新空间的删,双指针顶两个for


       有序数组的平方是改+排序,改好办,就是不好排序,开辟空间,利用题目特点进行排序


       长度最小的子数组是更高一层的查,我不仅要查,还要在查的同时搞点事情,子数组是连续的,用双指针滑动窗口


       螺旋矩阵是用数组模拟,考察的是对数组的掌握程度,更具体点是对数组遍历的掌握程度


       所以一般的考虑思路就能有个大概的方向:

               能不能暴力解决

               查是不需要开辟新地址的,可以暴力试试,但是怎么可以查得方便是需要考虑的

               删和改有时需要开辟新空间(因为要返回数组),可不可以不开辟空间进行呢

               使用双指针会不会更方便呢


链表

移除链表元素

设计链表

反转链表

两两交换链表中的节点

删除链表的倒数第N个节点

链表相交

环形链表||

总结

相关文章
|
3月前
|
存储 算法 搜索推荐
探索常见数据结构:数组、链表、栈、队列、树和图
探索常见数据结构:数组、链表、栈、队列、树和图
126 64
|
2月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
68 5
|
3月前
|
存储
一篇文章了解区分指针数组,数组指针,函数指针,链表。
一篇文章了解区分指针数组,数组指针,函数指针,链表。
26 0
|
4月前
|
存储 算法 C语言
C语言手撕实战代码_循环单链表和循环双链表
本文档详细介绍了用C语言实现循环单链表和循环双链表的相关算法。包括循环单链表的建立、逆转、左移、拆分及合并等操作;以及双链表的建立、遍历、排序和循环双链表的重组。通过具体示例和代码片段,展示了每种算法的实现思路与步骤,帮助读者深入理解并掌握这些数据结构的基本操作方法。
|
5月前
|
存储 开发者 C#
WPF与邮件发送:教你如何在Windows Presentation Foundation应用中无缝集成电子邮件功能——从界面设计到代码实现,全面解析邮件发送的每一个细节密武器!
【8月更文挑战第31天】本文探讨了如何在Windows Presentation Foundation(WPF)应用中集成电子邮件发送功能,详细介绍了从创建WPF项目到设计用户界面的全过程,并通过具体示例代码展示了如何使用`System.Net.Mail`命名空间中的`SmtpClient`和`MailMessage`类来实现邮件发送逻辑。文章还强调了安全性和错误处理的重要性,提供了实用的异常捕获代码片段,旨在帮助WPF开发者更好地掌握邮件发送技术,提升应用程序的功能性与用户体验。
84 0
|
5月前
|
存储 Java 开发者
揭秘!HashMap底层结构大起底:从数组到链表,再到红黑树,Java性能优化的秘密武器!
【8月更文挑战第24天】HashMap是Java集合框架中的核心组件,以其高效的键值对存储和快速访问能力广受开发者欢迎。在JDK 1.8及以后版本中,HashMap采用了数组+链表+红黑树的混合结构,实现了高性能的同时解决了哈希冲突问题。数组作为基石确保了快速定位;链表则用于处理哈希冲突;而当链表长度达到一定阈值时,通过转换为红黑树进一步提升性能。此外,HashMap还具备动态扩容机制,当负载因子超过预设值时自动扩大容量并重新哈希,确保整体性能。通过对HashMap底层结构的深入了解,我们可以更好地利用其优势解决实际开发中的问题。
133 0
|
7月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
7月前
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表
|
7月前
|
存储 算法 Java
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
66 2
|
8月前
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点.
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点
72 1

热门文章

最新文章