
leetcode
文章平均质量分 65
我家大宝最可爱
这个作者很懒,什么都没留下…
展开
-
递归:快速排序,归并排序和堆排序
快速排序的思想非常的简单,随便找一个元素作为标兵,然后使用双指针分别从左右开始移动,可以看到快速排序其实就是不断进行交换的操作,操作完一轮之后,再对左右两侧的数据进行同样的操作,把一个大的问题转换成小的问题,所以快排用的就是递归算法。快排有两个点非常容易写错与标兵比对的时候包含了等号。这是因为数组中可能有很多数据是与标兵相同的,与标兵相同的元素其实放在左边和放在右边都是可以的,反正最后排序之后都会与标兵相邻。而且还可以避免陷入死循环。例如下面这个数组,如果不加等号的话,你会发现l和r都不会变动。最外层的原创 2022-06-25 22:24:44 · 415 阅读 · 1 评论 -
递归:链表求和/反转字符串
每一对儿的节点处理都是一样的,并且不断的向后遍历,因此看到这个问题的时候可以用循环也可以用递归。有一点不同的是,子问题的入参需要预先处理,即。还有一点非常有意思,一般情况下,一个链表遍历到None的时候,就直接返回了,例如。拼接起来即可,但是这里却是不断的补充0元素,这样就可以把两个链表虚拟成一样长了。通常面对递归,我都会先思考子问题,然后根据子问题去求解原问题,这道题有两点不同。要短,因此肯定是先遍历完。,通常情况下只需要把。...原创 2022-08-16 10:38:04 · 682 阅读 · 0 评论 -
递归:x的n次幂
这个跟汉诺塔的问题非常的相像, 我不知道如何把n个圆盘从A移到C,但是如果我把n-1一个圆盘能移动到B,那么就可以完成。就可以了,这样问题最后就会缩减到n=1也就是停止条件上,然后递归再进行返回,我们操作这个返回结果即可。我也不知道,反正就是根据这个递归公式不断递归就可以求解出来了。这个递归也非常有意思,同样是有点难以理解,我们求。转化成递归函数的形式就是。其实可以递归成两种情况。......原创 2022-08-16 08:57:12 · 3749 阅读 · 0 评论 -
递归:两个数组的交集
这个问题并不能使用递归解决,但是因为很像递归,我单独分析一下。假如我们子问题已经求出解了,现在的问题是如何把元素。合并到一起去,这个逻辑处理应该怎么做?所以这个问题并不好做。...原创 2022-08-15 19:09:13 · 163 阅读 · 0 评论 -
递归:两两交换链表节点
首先假设子问题已经解决了,由于是两两交换节点,因此我们需要预留出两个节点出来才行,之前使用递归对链表求解的时候都是只需要操作head节点即可,但是这里要求两个节点交换,因此需要head和head.next两个节点,因此子问题的输入就是head.next.next了。...原创 2022-08-15 21:04:11 · 222 阅读 · 1 评论 -
递归:为运算表达式设计优先级
虽然有的子运算表达式比较长,也只不过多谢一个运算符号而已,况且还没有括号,那是非常的简单。但是我看了别人的代码之后,突然发现,一个运算表达式返回的是一个数组,那么子运算表达式的结果应该也是一个数组才对,而不应该是一个单一的数字。首先不说怎么做,如果是递归的话,子问题的返回是什么,肯定也是一个数组,因为子问题与原问题是结构是一致的。,即中间是一个运算符,左侧和右侧分别是一个运算表达式或者数字。原问题是给定一个运算表达式,返回一个数组,这个数组中是所有可能的运算结果。这个问题也是这样的,举个例子。...原创 2022-08-18 14:16:00 · 268 阅读 · 0 评论 -
递归:合并两个有序链表
原问题是合并两个链表,当我们提取出最小值的时候,子问题就可以变成合并缩小规模后的两条链表,例如合并两个链表。的头节点,子问题就变成合并两个链表。,我们提取出当前最小值是。原创 2022-08-15 18:49:56 · 476 阅读 · 0 评论 -
递归:判断一个数是否是2的幂
这种递归与我想的正好相反,我思考的是先假设子问题有解,然后根据子问题去求解原问题,也就是在。然后我就看了别人写的递归方法,更加的简单巧妙。如果sr返回的是true,那么res应该返回什么呢,举个例子分析,假如n=17,那么有。,说明子问题都不是2的幂次方,那么原问题肯定不是2的幂次方了,直接返回False即可。,我们知道了子问题的解,该如何去求原问题的解呢?既然子问题是2的幂次方了,即。n不断的缩小并且不断的重复操作,这不就是妥妥的递归吗。是n的幂次方,如果n也是2的幂次方,那么有。,否者不是2的幂次方。.原创 2022-08-16 08:57:33 · 1410 阅读 · 0 评论 -
递归:深度优先搜索
二叉树的问题一般都是优先考虑递归的,我们想要求出一棵树的深度,当我们知道了左子树和右子树的深度的时候,那么root节点的深度就是左右子树最大的值加1depth(root)=max(depth(root.left),depth(root.right))+1depth(root)=max(depth(root.left),depth(root.right))+1depth(root)=max(depth(root.left),depth(root.right))+1很明显这也是一个递归的式子,所以直接使用递原创 2022-06-25 14:28:18 · 737 阅读 · 1 评论 -
递归:递推公式
上面的递推问题,本质都是不断减小问题规模,要求f(n)f(n)f(n),先求出较小规模的f(n−1),f(n//2)f(n−1),f(n//2)等等,所以,最重要的就是如何分析问题得到递推公式。httpshttps。原创 2022-07-21 23:03:44 · 1195 阅读 · 0 评论 -
递归:递归的理解与应用
从一个最最简单的例子出发,我们要对一个数组进行求和,一个想当然的方法就是直接进行遍历求和,我们看看能否考虑使用递归。递归算法是一种直接或者间接调用自身函数或者方法的算法。说简单了就是程序自身的调用。递归算法就是将原问题不断分解为规模缩小的子问题,然后递归调用方法来表示问题的解。(用同一个方法去解决规模不同的问题)递归思维是一种从下向上的思维方式,使用递归算法往往可以简化我们的代码,而且还帮我们解决了很复杂的问题。...........................原创 2022-08-07 00:38:14 · 1183 阅读 · 0 评论 -
递归:顺时针打印矩阵
题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. row1 [1, 2, 3, 4 ],col1 ...原创 2018-08-15 21:55:22 · 224 阅读 · 1 评论 -
递归:普通全排列
s = 'ABCD'def permutations(p,s,e): if s == e: print p else: for i in range(s,e+1): p[s],p[i] = p[i],p[s] permutations(p,s+1,e) p[s],p[i] =...原创 2018-10-06 16:43:12 · 220 阅读 · 1 评论 -
动态规划:最长回文子串和子序列
动态规划原创 2022-06-11 16:31:21 · 182 阅读 · 0 评论 -
动态规划:最长公共子串和最长公共子序列
给定两个字符串,求出最长的相同的子串,例如给定子串和,其中两个子串串中共有的最长子串就是这个字符串。同样,这道题一看就是动态规划,我们首先列出状态转移方程,假设两个字符串分别以为结尾的最长公共子串长度为,当时,,如果这两个字符不相等,也就是说以为结尾的这两个字符串就不是公共子串,此时最长公共子序列公共子序列不需要连续,因此,即使两个字符串不相等,也不会为0。当前两个字符不等,的话,那么长度最少也是,但这还不够,因为我们希望拿到之前的比较中尽可能大的长度。那么当前字符已经不相等的情况下,就应该把当前的字原创 2022-06-12 22:07:12 · 300 阅读 · 0 评论 -
两数,三数之和
如果我们先确定一个数2,然后跟后面的2,3,5,7,11,13进行组合,当我们组合到11的时候2+11>13,那么我们还需要去跟更大的13去组合吗,显然是不需要的,所以我们可以直接加一个判断,跳过后面的数字。现在就回发现一个有趣的点了,2和11组合大于12,因此2不需要再跟13组合,那么第一层循环是3,还需要跟11和13组合吗,肯定也不需要了,也就是说,我们第二层循环的结尾不一定始终是n,而是可以不断往前推的。2+13>12,此时两个数的和大于目标值,我们移动右指针,这样可以让两个数的和小一点。...原创 2022-07-24 13:11:09 · 251 阅读 · 0 评论 -
leetcode:双指针法之-有序数组-去重与合并
21. 合并两个有序链表将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4非常正常的思路,定义两个指针分别指向两个链表,然后分别进行比较,序号0123456链表aa0a1......原创 2020-03-23 15:48:38 · 963 阅读 · 0 评论 -
leetcode:动态规划模板
我们假设第n-2个月的时候有dp[n-2]只兔子,第n-1个月的时候有dp[n-1]个兔子,那么第n个月有多少只兔子呢?第n个月的兔子一定是有第n-1个月的兔子来的,所以至少有dp[n-1]个兔子,但是同时呢,出生两个月的兔子都会再生一个兔子。出生两个月的兔子有多少了呢?往前推两个月的兔子就是当前出生两个月的兔子(废话文学),所以出生了两个月的兔子数量有dp[n-2]个,这些兔子会已经包含在了dp[n-1]之中,但是他们还会生dp[n-2]只兔子,所以。两个月前的兔子都会生一只兔子,那么两个月前有多少只兔子原创 2022-06-08 12:19:03 · 103 阅读 · 0 评论 -
leetcode:DFS&BFS的模板编程
这一次总结一下 BFS 的几个主要步骤肯定会用到 deque 的结构用来模拟队列,BFS精髓也在这里。队列里肯定是有一个初始点然后每次处理从队列中出队一个元素对元素进行扩张(具体如何扩张需要根据题目要求,一般是上下左右四个方向,本题是算上斜向共8个方向)对于扩张后满足某条件的点再进行处理,根据需要进入队列,进入队列的点就是扩到下一层的点(不同题目需要处理的方法不同,大家灵活运用)然后接着循环处理 deque 中的元素,直到 deque 为空,则代表所有点都已经完成扩张最后根据题目要求输出结果原创 2021-02-25 10:21:40 · 562 阅读 · 0 评论 -
动态规划:最大连续数组
题目:给定一个整数数组,找出总和最大的连续数列,并返回总和。这个题目初看不会,看了解答还是不会,又看了解答终于想明白了,关键点就一个 连续数列什么叫做连续数列,就是连在一起的数据。例如有一个数列,我们要找其中连续的子序列,假设-1是我们最大连续子序列的最后一个数字,然后我们求出以这个数字为结尾的所有的连续的子序列,然后把每一个子序列求和最后元素后面不管子序列和原始序列-21-34-121-54子序列1-1-1子原创 2020-10-15 23:54:36 · 3214 阅读 · 1 评论