里扣刷题第一周(10.10-10.17)

数组+链表+哈希表 题目总结。


前言

第一周主要学习了基础的数据结构知识,数组,哈希表和链表。


一、数组

定义:数组是存放在连续内存空间上的相同类型数据的集合。
具体代表性题目记录:
1)34题:用二分法解决。定义两个指针(left,right),分别指向数组的头和尾,然后移动。
难点:区间的开和闭。分两种情况讨论:[left, right]和[left, right)。根据题目具体情况具体分析。
2)26题:用快慢指针解决。定义两个指针(slow, fast),fast先动,slow跟上,当两指针指的数值相同时,slow停以下,最后返 回slow。
3)54,59题:旋转矩阵,具体就是分成四组遍历,顺序为上、右、下、左。
难点:指针更新条件(很繁琐~需要后续再刷)。
总结:1.数组元素只能覆盖不可删除(重点)。
2.相关题目:26、27、24、35、69、76、209、367、844、977等

二、链表

定义:通过指针串联在一起的结构,节点由数域和指针构成,有一个头head,结尾有个null。对链表的操作有增、删、插。
具体代表性题目记录:
1)203题:删除val的节点。两种情况讨论,val在头和在中间。最好先设定一个虚拟头(dummy),方便操作。最好是要将删除的节点在内存中delete。最后返回头部。
难点:区间的开和闭。分两种情况讨论:[left, right]和[left, right)。根据题目具体情况具体分析。
2)707题:设计链表。包括头插,尾插,index前插,删。其中index前插和前删利用while(index–),找到index前的节点,仔细揣摩,能更好理解链表结构(后续需要再刷。
3)206、24题:反转链表。也可以用递归,但是我没搞得太明白,所以就用正常方法。
4)19题:删除倒数第N个节点。还是用快慢指针,fast先走N+1步,slow再走,走到要删除的前一个节点。
5)02.07题:链表相交。求出两个表长度,让两个表尾对齐,遍历找相同。注意找的是指针,不是val。
6)142题:环形链表。分两步,先判断有没有环,s走一步,f走两步,直到f==s。再确定环的入口,从相遇点开始,一个从head出发,一个从f出发,每个走一步,直到相遇。

总结:1. 学会并熟悉链表的基本操作,具体问题再具体分析。
2. 一些特殊情况例如相交、环形这些问题记住具体思路。

三、哈希表

定义:一对key和val结构,可以根据key直接访问value,牺牲空间换取时间,常见的有set,map,数组。
具体代表性题目记录:
1)242题:寻找有效字母异位词。先建立一个26长度的数组nums当成哈希表,先遍历s字符串,将每个字母出现次数先存到表里,具体nums[s[i]-‘a’]++;接着遍历t,具体nums[t[i]-‘a’]–;最后如果nums[i]有不是0的,就false。
难点:区间的开和闭。分两种情况讨论:[left, right]和[left, right)。根据题目具体情况具体分析。
2)349题:两个数组的交集。遍历第一个数组,存入nums1;遍历nums2,如果在nums1中找到相同key的元素,插到result。
3)202题:快乐数。首先熟悉位操作:个位n%10,十位(n/10)%10,百位(n/10/10)%10;先编写一个统计sum的函数;重点是考虑会出现sum重复循环的情况。
4)454题:四数相加。定义一个map映射,a,b的和为key,出现次数为value,再遍历c和d,找到key为(0-(c+d)的元素,返回value。
5)383题:去重+小写。遍历magzine做++,遍历ransomNote做- -。

总结:1. 将几种哈希表的底层实现搞清楚,且key是否有序,数值是否可以重复,查询效率搞清楚。
2. 一些特殊情况例如相交、环形这些问题记住具体思路。

四、总结
提示:这里对文章进行总结:
本周为刚接触C++和刷题的第一周,主要从最基础的数据结构开始学习,做到先分析题目,然后看题解,最后自己独立写一遍,万事开头难呜呜呜呜。
下周计划:字符串+双指针+栈和队列。

五、参考资料

https://programmercarl.com/

你可能感兴趣的:(链表,数据结构,算法,数组,哈希表)