
算法
迷人的派大星
加油
展开
-
统计作战单位数(python实现)
题目: 数据规模:n == rating.length3 <= n <= 10001 <= rating[i] <= 10^5rating 中的元素都是唯一的来源: 力扣(LeetCode)方法一:三重循环暴力枚举class Solution: def numTeams(self, rating: List[int]) -> int: n = len(rating) ans = 0 for i i原创 2021-05-10 10:56:56 · 167 阅读 · 0 评论 -
递归实现翻转二叉树
经典二叉树题目思路:对于每一个结点,递归的实现左右孩子交换即可class Solution: def invertTree(self, root: TreeNode) -> TreeNode: if not root: return root # 这一步需先将左孩子保存起来,防止左孩子因更新而被覆盖; tmp_child = root.left root.left = self.invertTree(r原创 2021-03-13 23:55:16 · 324 阅读 · 1 评论 -
最低加油次数问题(c++实现)
问题: 汽车从起点出发驶向目的地,该目的地位于出发位置东面 target 英里处。沿途有加油站,每个 station[i] 代表一个加油站,它位于出发位置东面 station[i][0] 英里处,并且有 station[i][1] 升汽油。假设汽车油箱的容量是无限的,其中最初有 startFuel 升燃料。它每行驶 1 英里就会用掉 1 升汽油。当汽车到达加油站时,它可能停下来加油,将所有汽油从加油站转移到汽车中。为了到达目的地,汽车所必要的最低加油次数是多少?如果无法到达目的地,则返回 -1 。原创 2021-03-05 17:43:04 · 626 阅读 · 0 评论 -
二叉树的前中后序遍历的迭代实现
二叉树的前中后序遍历是学习树形结构时必须要掌握的算法,同时也是树形结构中最基础的算法,通过前中后序遍历的变形能解决很多二叉树相关的算法问题。前中序后算法的递归版本代码比较简单也很简洁明了,这里不再给出。下面分别给出前中后序的迭代版本。先序遍历/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; *原创 2020-08-10 18:22:47 · 429 阅读 · 0 评论 -
一文教会翻转单链表的三种经典方法
题目:翻转链表来源:Leetcode翻转链表是很经典的操作链表场景,可以很基础的操作,以下给出三种方式对链表进行翻转。头插法头插法是一种建立链表的基本操作,在这里,我们也可以将翻转链表这个问题转化为头插法建立新链表的问题。思路:首先我们定义一个头结点,然后我们对题目所给的单链表进行遍历,每遍历一个结点,我们就将这个结点摘下,以头插法建立单链表的思想,在头节点后进行 “头插” 操作。当单链表遍历完成时,由于头插法的特性,我们得到的新链表即为原来链表的翻转版。假如给定的单链表如下:头插法新建链原创 2020-06-26 21:56:08 · 603 阅读 · 0 评论 -
删除链表指定值的结点(递归与迭代实现)
题目:删除链表指定值的结点来源:Leetcode递归/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* removeElements(ListNode* hea原创 2020-06-26 18:15:46 · 429 阅读 · 1 评论 -
leetcode1028.从先序遍历还原二叉树(Python实现)
题目:从先序遍历还原二叉树来源:Leetcode由于题目保证了,当树只有一个结点的情况下,只可能是左结点。再结合先序遍历的特性,我们可以知道,当遍历到某个结点S 开始向上回退的时候,回退到的结点T一定是从根结点到S(不包括S)的某条路径上的一个右结点。因此,我们去找T过程实际上就是为这个结点T找双亲结点的过程。代码如下:class TreeNode: def __init__(self, x): self.val = x self.left = No原创 2020-06-18 13:48:46 · 404 阅读 · 0 评论 -
爬楼梯(Python实现)
题目:爬楼梯来源:Leetcode很经典得问题,与求斐波那契数列基本一样,以下给出递归和动态规划两种解法。递归import functoolsclass Solution: @functools.lru_cache() def climbStairs(self, n: int) -> int: if n == 1: return 1 if n == 2: return 2 r原创 2020-06-13 08:55:04 · 2664 阅读 · 0 评论 -
leetcode面试题46. 把数字翻译成字符串(Python实现)
题目:把数字翻译成字符串来源:Leetcode动态规划经典的动态规划题目,以输入12258 为例,我们可以看到,之所以会有多种方法翻译是因为 1 可以被映射到字母 a ,而 12 同样也可以在映射表中找到对应的映射关系。但是注意,以 0 开头的数字是无效的,例如 10020 中的 02 并不是一个有效的映射,因此这种情况我们不必要考虑。以 12258 为例,我们分别对其编号X1X2X3X4X5 (即Xi), (1 <= i <= 5)那么现在,Xi 处的翻译情况分如下两种情形:原创 2020-06-09 12:53:56 · 339 阅读 · 0 评论 -
leetcode128.最长连续序列(Python实现)
题目:最长连续序列来源:Leetcode根据题目要求可知,要求得最长连续序列为连续得自然数,例如:[1,2,3,4] # 连续[1,2,4] # 非连续首先,我们思考暴力解法。对于数组中的每个数num[i],我们用内层循环重新遍历数组,寻找有没有target == nums[i] + 1,如果为True,继续+1遍历,若为False,退出内层循环,输出当前连续序列长度。对于暴力解法,我们可以对其进行优化,我们使用Hash表来保存nums中元素,这样我们在判断是否存在target == nu原创 2020-06-06 20:24:42 · 705 阅读 · 0 评论 -
leetcode面试题29. 顺时针打印矩阵(Python实现)
题目:顺时针打印矩阵来源:Leetcode我们分别定义上下左右边界,模拟顺时针打印即可。每次打印时,上下左右指针分别-1,即向内收缩。当有两个指针相遇时,即此时已打印完,break即可代码如下:class Solution: def spiralOrder(self, matrix: List[List[int]]) -> List[int]: if not matrix: return [] left, right, up, down = 0, l原创 2020-06-05 08:24:30 · 385 阅读 · 0 评论 -
leetcode238.除自身以外数组的乘积(Python实现)
题目:除自身以外数组的乘积来源:Leetcode咋一看这道题似乎非常简单,直接用整个数组的乘积除去当前元素不就好了吗,但题目中是有限制不能使用除法的,而且这种做法也是有风险的,一旦出现 0 就失效了。同时,题目还规定,除了输出数组外,我们只能使用常数个空间。那么,我们应该如何思考呢?左右数组乘积我们设想下,如果我们能将该数组分为两个部分,一部分是当前元素的左边所有的元素,另一部分是当前元素右边所有的元素,那么,在求除当前元素外数组中所有元素的积时,我们只需要将左部分乘积乘上右部分乘积即可。但是,原创 2020-06-04 10:17:22 · 536 阅读 · 0 评论 -
leetcode141.环形链表(Python实现)
题目:环形链表来源:Leetcode链表判断环很适合用双指针求解,我们定义一快一慢两个指针,有以下情形:当链表无环时,显然快指针一定会先走到链表末尾当链表存在环时,快指针和慢指针一定会在链表的某一个节点重合,即快指针可能领先了慢指针一圈或者多圈并相遇基于以上思想,代码实现如下:# Definition for singly-linked list.class ListNode: def __init__(self, x): self.val = x原创 2020-06-04 10:02:16 · 353 阅读 · 0 评论 -
Python与或运算
今天碰到一道有意思的题目,看了之后发现自己对Python与或的理解还是欠缺,如下。题目:求1+2+…+n来源:Leetcode如果不加限制,我们有很多方法计算该值,例如高斯公式,递归等。我们思考下递归的解法: def sumNums_if(self, n: int) -> int: if not n: return n return n + self.sumNums_if(n-1)即当n等于0的时候,开始自底向上返回。那么,当限制了if语句的时候原创 2020-06-02 10:10:12 · 3483 阅读 · 0 评论 -
leetcode101.对称二叉树(Python实现)
题目:对称二叉树题目来源:Leetcode对称树满足什么条件呢?左右子树均为空左右子树均不为空且左右子树根节点相等,且左子树的左树对称于右子树的右树and右子树的左数对称于左子树的右树如何判断左子树的左右树和右子树的左右树?递归即可,代码如下:class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = Noneclas原创 2020-05-31 19:45:00 · 426 阅读 · 0 评论 -
leetcode707.设计链表(Python实现)
题目:设计链表来源:Leetcode手写链表,代码如下:# 自定义单节点class ListNode: def __init__(self, x): self.val = x self.next = Noneclass MyLinkedList: def __init__(self): """ Initialize your data structure here. """ #原创 2020-05-30 13:38:29 · 640 阅读 · 0 评论 -
leetcode198.打家劫舍(Python实现)
题目: 打家劫舍来源:Leetcode经典动态规划问题,由于每个房屋存放金额为非负整数,这简化了问题。首先我们初始化一个dp数组,用以保存抢到第 i 间屋子时的当前最大收益我们思考一个问题,当我们到达第 i 间屋子时,我们有两个选择:抢劫第 i 间屋子,根据规则,则 第 i - 1号屋子我们是不能抢的,此时我们的收益是 dp[i - 2] + nums[i]不抢劫第 i 间屋子,那么此时我们的收益就等于 dp[i - 1]则第i间屋子的收益就为 max(1,2),代码如下:class原创 2020-05-29 09:25:03 · 597 阅读 · 0 评论 -
leetcode394.字符串解码(Python实现)
题目:字符串解码题目来源:Leetcode此题由于保证了输入一定是有效的,因此我们可以不必考虑括号失配的情形。由于存在括号嵌套的情况,因此我们不能简单的从左到右匹配输出,而是存在内层括号时,我们应该先算出内层括号中的字符串解码然后再由外层计算,这显然很符合栈 “先进后出”的特性。对输入字符串s进行遍历,有如下情形:当前字符为数字,那么我们将其累加起来,用做其后【…】字符串出现的次数当前字符为普通字符,我们用一个临时结果集先将其连接当前字符为 “【”,显然此时我们要进入括号内层了,所以进内层原创 2020-05-28 15:36:00 · 758 阅读 · 0 评论 -
leetcode92.反转链表2(Python实现)
题目:题目来源:Leetcode链表反转思路我们很熟悉,此题多了一步为 翻转区间 [m,n]上的节点,因此我们要先找到m处的节点以及前驱,将链表在此处断开,再在m处往后数n-m个节点,并对该段的节点实现翻转,最后将链表连接起来即可。代码如下:在这里插入代码片...原创 2020-05-25 10:30:08 · 695 阅读 · 0 评论 -
leetcode4.寻找两个正序数组的中位数(Python实现)
题目来源:leetcode归并(复杂度不满足要求)若题目没有要求时间复杂度,对于两个有序数组,我们很容易想到用双指针归并的思想解决,此时复杂度为O(m+n),代码如下:class Solution: # o(m+n)解法 def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float: m, n = len(nums1), len(nums2) res =.原创 2020-05-24 16:16:25 · 1292 阅读 · 0 评论 -
leetcode74.最小覆盖字串(Python实现)
题目:最小覆盖子串题目来源:leetcode看到子串问题,一个很容易想到的思路是利用双指针来解决,那么,在本题条件下如何利用双指针实现呢,首先看题目要求,我们可以得出如下结论:s长度严格不小于t长度输出结果为字串,意味着必须连续可以看出对输出结果的不要求保持顺序滑动窗口由于要求字串必须包含t中所有字符,所以我们不妨先初始化一个Hash表t_dt,键为t中字符,值为该字符在t中出现的次数。以 s=“ADOBECODEBANC”,t=“ABC” 为例from collections im原创 2020-05-23 12:35:33 · 866 阅读 · 0 评论 -
Python判断回文数及进阶
判断回文是一个很基础同时也很经典的问题,首先我们来了解一下何谓回文?引入百度百科的解释:“回文”是指正读反读都能读通的句子,它是古今中外都有的一种修辞方式和文字游戏,如“我为人人,人人为我”等。在数学中也有这样一类数字有这样的特征,成为回文数(palindrome number)。 [1]设n是一任意自然数。若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数。例如,若n=1234321,则称n为一回文数;但若n=1234567,则n不是回文数。 [1]注意:1.偶数个的数字也有回文原创 2020-05-19 20:03:35 · 1763 阅读 · 0 评论 -
leetcode42 接雨水(Python实现)
题目:给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。示例:输入: [0,1,0,2,1,0,1,3,2,1,2,1]输出: 6来源:力扣(LeetCode)链接:...原创 2020-04-04 16:04:22 · 752 阅读 · 0 评论 -
LeetCode46.全排列(Python实现)
题目:给定一个没有重复数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/permutations经典回溯算法题目,代码及注释如下:from typ...原创 2020-03-16 22:06:17 · 900 阅读 · 0 评论 -
LeetCode 300-最长上升子序列(Python实现)
题目:给定一个无序的整数数组,找到其中最长上升子序列的长度。示例:输入: [10,9,2,5,3,7,101,18]输出: 4解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。说明:可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。你算法的时间复杂度应该为 O(n2) 。进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗?来源:力扣(Le...原创 2020-03-15 12:00:10 · 572 阅读 · 0 评论 -
经典排序算法3-插入排序(Python实现)
经典排序算法之插入排序插入排序法(Insert Sort)是将数组中的元素逐一与已排序好的数据进行比较,前两个元素排序好,再将第三个元素插入适当的位置,所以这三个元素仍然是已排序好的,接着将第四个元素加入,重复以上步骤,直到排序完成为止。可以看作是在一串有序的记录R1、R2…Rn中插入新的记录,并使得n+1的数据依然排序妥当。以下我们依然使用10, 8, 44, 9, 12, 37, 21, ...原创 2019-04-27 22:13:38 · 336 阅读 · 0 评论 -
经典排序算法2-选择排序(Python实现)
经典排序算法之选择排序选择排序法可使用两种方式排序,即在所有的数据中,当从大到小排序时,将最大值放入第一个位置;当从小到大排序时,将最大值放入最后一个位置。例如,一开始在所有当数据中挑选一个最小项放在第一个位置(假设是从小到大排序),再从第二项开始挑选一个最小项放在第二个位置,从此反复,直到排序完成为止。以下我们采用10, 8, 44, 9, 12, 37, 21, 5来完成排序示例:首先...原创 2019-04-27 01:07:59 · 328 阅读 · 0 评论 -
经典排序算法1-冒泡排序(Python实现)
经典排序算法之冒泡排序冒泡排序法又称为交换排序法,是从观察水中气泡变化构思而成的,原理是从第一个元素开始,比较相邻元素的大小,若大小顺序有误,则对调后在进行下一个元素的比较,就仿佛气泡逐渐从水底冒升到水面一样。如此扫描过一次之后,就可以确保最后一个元素位于正确的顺序。接着逐步进行第二次扫描,直到完成所有元素的排序关系为止。我们以10, 8, 44, 9, 12, 37, 21, 5这一组数为例...原创 2019-04-21 20:11:51 · 540 阅读 · 0 评论