
leetcode
回曜灵於太清
这个作者很懒,什么都没留下…
展开
-
【leetcode】27. 移除元素
1、本题使用快慢指针,将fast读取的符合要求数值放入slow位置即可。2、改进原因:如果要移除的元素恰好在数组的开头,例如序列[1,2,3,4,5],当val == 1时,我们需要把每一个元素都左移一位。 注意到题目中说:“元素的顺序可以改变”。所以,实际上我们直接将最后一个元素 5 移动到序列开头,取代元素 1,得到序列 [5,2,3,4],同样满足题目要求。这个优化在序列中 val 元素的数量较少时非常有效。 实现方面,我们依然使用双指针,两个指针初始时分别位于数组的首尾,向中间移动遍历该序原创 2022-08-13 21:58:25 · 184 阅读 · 1 评论 -
【leetcode】26. 删除有序数组中的重复项
1、方法一思路是顺序读取列表内容,每次删除重复元素后,将后续元素前移一位,然后继续顺序读取。由于python特性所以代码简洁,但是由于嵌套循环,时间效率很低。2、方法二使用双指针,快指针用于判断新元素和结束条件,慢指针用来更改列表内容。由于原题要求,只需要更改列表值,不要求删除后续重复元素,所以只需要将前n项更改为不重复元素即可。...原创 2022-08-08 23:33:45 · 1416 阅读 · 0 评论 -
【leetcode】24. 两两交换链表中的节点
1、本题虽然难度中等,但并不难,可用迭代和递归两种方法解答。原创 2022-08-07 19:32:28 · 222 阅读 · 0 评论 -
【leetcode】22. 括号生成
1、暴力法是将全部2*n个的字符组合罗列出来(不一定左右括号各为n个),然后判断删除不符合要求的。判断方法:依次读取字符串,num=0,左括号num+=1、右括号num-=1,若其中出现小于0的情况、或最后num!=0,则该字符串不符合要求。2、递归是一种算法结构,而回溯是一种算法思想,它是用递归实现的,回溯的过程类似于穷举法,但回溯有“剪枝”功能,即自我判断过程。3、回溯法在运行的过程中进行判断,只有符合要求的情况才添加括号,并进行递归。判断方法:①当len(总长) == 2 * n时停止;...原创 2022-07-31 11:55:23 · 1369 阅读 · 0 评论 -
【leetcode】21. 合并两个有序链表
1、本题较简单,使用归并排序即可。2、学习通过递归排序的方法。3、在递归调用自身时,self.mergeTwoLists(list1, list2.next);self.mergeTwoLists(list1.next, list2),使用“self.xx”。原创 2022-07-31 11:53:56 · 101 阅读 · 0 评论 -
【leetcode】20. 有效的括号
1、判断括号的有效性可以使用「栈」这一数据结构来解决。2、由于需要三组不同的括号进行匹配,所以使用字典记录匹配对象。3、输出列表是否为空:return not stack,同return stack == []原创 2022-07-31 11:52:25 · 1424 阅读 · 0 评论 -
【leetcode】19. 删除链表的倒数第 N 个结点
1、双指针思路:后指针先移动n次,然后前后两指针一起移动,当后指针移动至末尾,则前指针在倒数第n个位置。2、栈:将ListNode对象依次放入列表中,从后往前删除n次,则得到倒数第n+1个位置。3、为了便于实现①找到倒数第n+1个对象;②返回值为第一个对象;③考虑返回值为空的情况。创建第一个对象时,采用start = ListNode(0, head)的方法。......原创 2022-07-31 03:00:01 · 114 阅读 · 0 评论 -
【leetcode】18. 四数之和
1、该题目为15、16题的结合,只需在“三数之和”外层再添加一层循环即可。但是,我们发现该方法的运行时间很长,时长达到“840ms”,需要优化。2、在循环体内,添加判断语句,以此减少循环的次数。经过优化,时长减少至“44ms”。...原创 2022-07-27 14:24:54 · 296 阅读 · 0 评论 -
【leetcode】17. 电话号码的字母组合
总结1、题目描述,根据数字字符串,输出对应字符的组合,n个数字对应组合的字符个数为n,最后将全部组合置于列表中。2、面对寻找所有的可行解的题目,可以选择回溯算法(深度优先遍历、广度优先遍历),代码通过函数递归实现回溯算法。3、代码中,在执行完成backtracking()的内容后,使用path.pop()删除path列表的最后一个元素,目的是完成剩余的深度优先遍历过程。...原创 2022-07-26 10:23:02 · 88 阅读 · 0 评论 -
【leetcode】16. 最接近的三数之和
1、思路同15题,但是由于只需输出最接近target的元素和,所以可以不进行重复数组判断。2、暴力破解的三重循环,不出所料依旧超时。3、python中的无穷大表示方法。原创 2022-07-25 13:56:28 · 386 阅读 · 0 评论 -
【leetcode】15. 三数之和
1、方法一通过三重循环获取数组,但是题目要求最终结果不能存在重复,因此需要先记录列表重复元素位置,再将不重复数组,复制至新列表中。但是由于时间复杂度为O(n³),结果超时了。2、方法二该题重点是如何去除列表中的重复数组,为此的解决方法首先先对列表元素排序,然后再进行遍历,在第i次循环中,若该元素与(i-1)的元素相同,则跳过第i个元素,以此去除重复的数组。双指针我们在第二层循环内,寻找第2,3个元素的过程中,两个指针分别指向两侧,通过,判断是否要将三个元素放入列表中,以及是否移动指针。...原创 2022-07-24 19:21:11 · 66 阅读 · 0 评论 -
【leetcode】14. 最长公共前缀
1、思路先找到列表中最短的字符串Minstr,然后遍历列表中的全部字符串是否与Minstr有相同子字符串,最后输出最长子字符串。原创 2022-07-21 16:12:26 · 148 阅读 · 0 评论 -
【leetcode】13. 罗马数字转整数
1、顺序读取字符串,若字符对应数值小于右侧对应数值,则该数值取反。原创 2022-07-21 15:16:49 · 150 阅读 · 0 评论 -
【leetcode】12. 整数转罗马数字
1、方法一列出所有出现的罗马字符,通过循环计算输出字符顺序。注意所有字符中包括“IV=4,IX=9”这样的字符。2、硬编码数字方法:将各个十进制的数字位,用罗马字符分别表示出来,直接输出即可。由于输出的是字符,可以输出**return A+B+C**为返回值,使代码更简洁。...原创 2022-07-21 14:22:52 · 208 阅读 · 0 评论 -
【leetcode】11. 盛最多水的容器
1、通过“双指针”解决盛水问题非常典型。指针从两侧开始向中间移动,每次比较盛水量,最终得到输出结果。问题的关键在于移动哪一侧,由于盛水量为“两个指针指向的数字中较小值∗指针之间的距离”,所以我们每次移动指针对应高度较小的一侧。重视学习该类题目的双指针思路。...原创 2022-07-20 17:08:57 · 121 阅读 · 0 评论 -
【leetcode】9. 回文数
总结1、方法一思路:将整数转化为字符串,利用切片从两端进行读取比较。2、方法二思路:x每次%10加至(10*y)上,且x/10,当!(x>y)时结束while循环。这样便只需比较整数x的后半部分与前半部分是否相等即可,避免了整体反转可能产生的溢出问题。同时考虑到整数x的位数可能是奇数或偶数,返回值为return x == y or y // 10 == x。3、方法三图一乐即可,效率并不高。...原创 2022-07-19 15:39:15 · 91 阅读 · 0 评论 -
【leetcode】8. 字符串转换整数 (atoi)
1、本题重点学习DFA算法,通过“有穷自动机”避免了冗杂的情况,使代码整体逻辑性更强。我们也可以用下面的表格来表示这个自动机2、一般方法详见方法一。原创 2022-07-18 21:11:13 · 139 阅读 · 0 评论 -
【leetcode】7. 整数反转
1、本题较为简单,输出首尾反转之后的输入x即可,因此第一时间想到的是将其转化为字符串,利用字符串的切片将其首尾反转,再转化为int型数值。这是方法一的思路,另外要注意的两个细节是①根据正负号分类处理;②判断转化为int型之后是否越界。2、方法二没有将其转化为字符串,思路为处理输入整数x,通过"%10"or"%-10"得到尾数,将尾数加到输出整数y上,最后将x整除"10"or"-10";每次遍历判断x是否为0,y*10后是否越界。3、注意:负数整除要"除以(-10)"。...原创 2022-07-31 12:04:20 · 134 阅读 · 0 评论 -
【leetcode】6. Z 字形变换
1、方法一是纯粹找规律的,画出矩阵能够观察得出,n行的矩阵可分为两类,第一行与最后一行一类,中间行一类;通过找规律依次输出每一行即可。2、方法二的压缩矩阵很巧妙,通过观察得出,每一个字符都可以视为添加到了所在矩阵行的正右边第一个。尤其是这里的上下波动添加字符,这里的逻辑循环值得认真学习。同时循环外使用x,循环内使用enumerate函数的i,v,也值得学习并在今后使用。3、字典与哈希表的关系在python中,哈希表是实现字典的其中一种方式,除了哈希表,实现字典的另一种常见方式是红黑树。...原创 2022-07-17 20:48:44 · 140 阅读 · 0 评论 -
【leetcode】5. 最长回文子串
1、方法思路:我们要寻找回文序列,由回文序列的性质可知,其分为两种①“xxxAxxx”最中间为一个字符;②“xxxAAxxx”最中间为多个相同的字符。因此,我们从最中间字符入手,遍历字符串的每一个字符,首先判断当前位置的字符是否能成为中间字符,若为中间字符,则通过指针指向其中间字符的两端,在移动的同时判断两端的字符是否相等,若不等则结束本轮循环,输出当前字符作为中间字符的最长回文子串。考虑到当前字符对应的回文子串有可能是上述的②情况,所以当我们发现当前字符与其右侧字符相同时。......原创 2022-07-15 09:57:31 · 319 阅读 · 0 评论 -
【leetcode】3. 无重复字符的最长子串
1、方法一思路遍历字符串一遍。每次循环时判断当前字符是否在新建的字典中,若存在,则计算该子字符串长度,重新记录当前字符所在位置;若不存在,则将字符和所在位置放入字典中。最后输出最长子字符串长度。字典在遍历过程中是无法修改或删除字典内数据的。因此方法一中,将需要删除的变量写入列表中,在遍历列表的过程中,逐个删除字典中的数据。字典删除a.pop(key)3、方法二中使用了滑动窗口的方法,两个指针分别指向字符串的两端,判断两指针中间的内容是否符合需要,然后再进行指针移动。列表添加、删除注意。...原创 2022-07-14 10:08:21 · 208 阅读 · 0 评论 -
【leetcode】2. 两数相加
总结1、这里需要了解Python模拟指针的方法。本题中,实例化对象内的参数指向下一块内存中的实例化对象,以此模拟了C++中指针操作。2、此处模拟了指针不断串联的过程,做题中耽误了很多时间,需要学会。3、此处的返回值不是对象r本身,而是使用了”返回re->r”的操作,需要学习。.........原创 2022-07-14 09:39:52 · 364 阅读 · 0 评论 -
【leetcode】1. 两数之和
总结1、使用字典便于查找和添加。哈希查找复杂度为O(1),相较于暴力破解效率更高。2、题目关键在于,能否意识到将两数相减添加到字典中,便于以后查找的操作。原创 2022-07-14 09:16:53 · 258 阅读 · 0 评论