
leetcode
文章平均质量分 60
AI414010
图像处理方向研究生,目前就职运动健康算法方向。不随时在线,留言会看。
展开
-
【杨辉三角妙解】python用生成器计算杨辉三角
【题目来源】:廖雪峰老师的python教程【问题】:【解答】:# -*- coding: utf-8 -*-def triangles(): L = [1] while True: yield L[:] #用生成器每次取一行的数据,通过现有的一行计算下一行 L.append(0) #本行补0,这个操作太妙了! L = [L[i] + L[i - 1] for i in range(len(L))] #求新的一行测试程序# 期待输原创 2021-03-21 10:42:45 · 245 阅读 · 0 评论 -
Leetcode题228、汇总区间(Python题解)
问题:题目来源:力扣(LeetCode)Leetcode228.区间汇总难度:简单分析:这道题的思路很简单,单次遍历即可。需要注意的是边界情况的处理,在数组首末的值要考虑到。解决方法:1:一次遍历class Solution: def summaryRanges(self, nums: List[int]) -> List[str]: res = [] start = 0 length = len(nums) w原创 2021-01-10 19:10:17 · 364 阅读 · 1 评论 -
Leetcode题300、最长上升子序列(Python题解)经典题
问题:题目来源:力扣(LeetCode)leetcode300.最长上升子序列难度:简单分析:经典题。一、动态规划观察数组,要求数组的最长上升子序列,可以想到长度为i的子序列可以由长度为i - 1的递推而来,因此考虑动态规划。那么动态规划的状态空间该如何定义呢?思考最长上升子序列的寻找过程,当我们遍历到数组的i位置时,无法判断最终的最长子序列是由i结尾的所属的子序列还组成还是由i - 1结尾或者其他的子序列组成。因此我们需要把位置i之前的所有位置所在的子序列的长度都记录下来。因此我们这样原创 2020-11-05 14:33:18 · 574 阅读 · 0 评论 -
Leetcode题1122、数组的相对排序(Python题解)字典练习
问题:题目来源:力扣(LeetCode)leetcode1122.数组的相对排序难度:简单分析:非常好的字典操作练习题。思路:统计arr1中与arr2相同的元素及其个数,和arr1中与arr2不同的元素及其个数。相同的部分按照arr2的顺序排序,不同的部分直接sort。然后将两部分拼接到一起。解决方法:1:字典class Solution: def relativeSortArray(self, arr1: List[int], arr2: List[int]) -> Li原创 2020-11-01 22:35:02 · 341 阅读 · 0 评论 -
Leetcode题129、求根到叶子节点数字之和(Python题解)递归典型题
问题:题目来源:力扣(LeetCode)Leetcode129.求根到叶子节点数字之和难度:中等分析:这是帮助理解递归非常有效的题,不理解递归的同学一定要好好看这道题的DFS解法。用DFS和BFS都可以实现。DFS的思路非常直接,求出每条路径的数字,然后相加。BFS的思路是层数每深入一层,上层的值就需要多乘10,一直累加到最后一层。解决方法:1:DFS#好好理解preTotal的作用,向下递归时,将参数带往子节点,用于求路径和;向上返回时将每个路径和依次相加,求得最终的总和。cl原创 2020-10-29 11:21:28 · 401 阅读 · 0 评论 -
并查集模板python版
并查集模板# Pythondef init(p): # for i = 0 .. n: p[i] = i; p = [i for i in range(n)]def union(self, p, i, j): p1 = self.parent(p, i) p2 = self.parent(p, j) p[p1] = p2def parent(self, p, i): root = i while p[root] != root:原创 2020-10-28 11:06:57 · 757 阅读 · 0 评论 -
Leetcode题547、朋友圈(Python题解)Amazon面试题
问题:题目来源:力扣(LeetCode)leetcode547.朋友圈难度:中等分析:这是一道典型的并查集的题目,给定几个点和它们的关系,求取它们属于几个集合。直接套并查集的模板就可以。当然这道题也可以使用DFS和BFS做。解决方法:1:DFSclass Solution: def findCircleNum(self, M: List[List[int]]) -> int: N = len(M) count = 0 vis原创 2020-10-28 11:06:12 · 705 阅读 · 0 评论 -
Leetcode题212、单词搜索II(Python题解)Amazon面试题
问题:题目来源:力扣(LeetCode)leetcode212.单词搜索II难度:中等分析:本题分为两部分,一部分是需要在网格中找到所有可能的字母组合;一部分是判断找到的组合是否是在字典中存在。按照这种思路,我们可以使用回溯法。现在我们得到了一个最容易想到的回溯法,那么是否有方法可以进行优化呢?我们观察到在回溯的过程中,根据样例,如果我们前两个字母找到的是ob,那么就可以提前停止回溯了,因为字典中不存在ob开头的字符串。那么我们如何快速判断字典中是否存在以ob开头的字符串呢?这就需要用到Tr原创 2020-10-27 20:47:02 · 490 阅读 · 0 评论 -
Leetcode题208、实现Trie(前缀树)(Python题解)字节跳动面试题
问题:题目来源:力扣(LeetCode)leetcode208.实现Trie(前缀树)难度:中等分析:使用字典的方法实现有同学字节一面手撕Trie树,模板好好背住!解决方法:1:class Trie: def __init__(self): self.root = {} self.end_of_word = "#" def insert(self, word: str) -> None: node = self.r原创 2020-10-27 18:43:35 · 559 阅读 · 1 评论 -
Leetcode题1024、视频拼接(Python题解)华为面试题
同类问题:跳跃游戏跳跃游戏II划分字母区间问题:题目来源:力扣(LeetCode)leetcode1024.视频拼接难度:中等分析:动态规划,与零钱兑换思路类似。贪心,这道题的贪心解法和跳跃游戏一样,一脉相承,做下来就有手感了!解决方法:1:动态规划class Solution: def videoStitching(self, clips: List[List[int]], T: int) -> int: dp = [float('inf')]原创 2020-10-27 11:54:57 · 864 阅读 · 3 评论 -
Leetcode题845、数组中的最长山脉(Python题解)笔试常见题
问题:题目来源:力扣(LeetCode)leetcode845.数组中的最长山脉难度:中等分析:复杂的题目往往只需要最朴素的解法。山脉有两个坡,前坡和后坡,但只有一个山顶。我们从前向后寻找上升数组,从后向前寻找上升数组,然后求取每个山顶位置的前坡和后坡长度之和,取最大值即可。解决方法:1:迭代class Solution: def longestMountain(self, A: List[int]) -> int: if not A: return 0原创 2020-10-27 10:42:11 · 558 阅读 · 0 评论 -
两个月搞定面试算法【小白leetcode刷题训练】【python专场】
前言刷题顺序来自极客时间,共分为8个专题,每周1个,两个月认真刷完基本大厂面试OK(我说的是认真刷!只抄题解不算)。截止到博主结束秋招时只刷到第5个专题,也基本够用了。也就是说认真刷题的话一个月就可以有offer入手了。当然现在BAT的笔试做起来还是觉得费力,笔试是真的难啊!博主是python选手,题解都是python写的。有问题欢迎交流,共同进步。文章内附leetcode链接,直接点链接去做就行。同类型的尽量整理到一起了,也方便自己今后复习。推荐五遍刷题法1、读题+思考,10分钟内没思路,直接原创 2020-10-22 21:47:39 · 3322 阅读 · 2 评论 -
Leetcode题763、划分字母区间(Python题解)
同类问题:跳跃游戏跳跃游戏II问题:题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/partition-labels/难度:中等分析:贪心这道题的思路和跳跃游戏II基本一致。首先我们需要得到跳跃的步长,即本题中同字符出现的首末位置。然后从第一个字符开始“跳跃”,查找本字符长度区间内其他字符所能到达的最远位置,不断向更远的位置跳跃,直到无法再向后跳跃,说明本区间恰好由几个同种字符(每种字符包含所有个体)构成,为一个合法最小区间。原创 2020-10-22 18:20:51 · 475 阅读 · 0 评论 -
Leetcode题45、跳跃游戏II(Python题解)华为面试题
问题:题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/jump-game-ii/难度:困难分析:贪心算法解决方法:1:#贪心#从当前点进行一次跳跃,然后将end的边界拉到本次跳跃最远的边界,遍历这个区间内第二次跳跃能到达的最远点,#当这个区间遍历结束后,更新最远点,将end拉到这个最远点。跳跃次数+1。#最后一个点不用跳,直接到达就行#所以遍历到n - 1就行class Solution: def jump(s原创 2020-10-22 18:11:05 · 892 阅读 · 0 评论 -
Leetcode题55、跳跃游戏(Python题解)华为面试题
问题:题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/jump-game/难度:中等分析:贪心算法来做以样例[2, 3, 1, 1, 4]为例,第一步可以跳2步,在两步范围内寻找下一步能跳的最远的位置,为第二个数3,然后站在第二个数的位置寻找在3步范围内,下一步跳得最远的位置,可以直接跳到最末端,则可达到最后一个位置,返回True。解决方法:1:#贪心class Solution: def canJump(self, n原创 2020-10-22 17:10:38 · 896 阅读 · 0 评论 -
Leetcode题925、长键输入(Python题解)双指针、每日一题
问题:题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/long-pressed-name/难度:简单分析:双指针题目,快慢指针类型,注意边界条件的处理。解决方法:1:双指针class Solution: def isLongPressedName(self, name: str, typed: str) -> bool: l1, l2 = len(name), len(typed) i原创 2020-10-21 10:33:06 · 301 阅读 · 0 评论 -
Leetcode题143、重排链表(Python题解)
问题:题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/reorder-list/难度:中等分析:这道题是链表题目训练题的合集吧哈哈,常见的链表操作都有体现。方法一:将链表节点用数组保存下来,然后按照题目顺序重新连接起来。注意存的是节点,而不是链表的值,因为题目要求不能只改变链表值。方法二:先寻找链表中点,再对链表后半部进行翻转,然后合并链表。好家伙!一道顶三道,寻找链表中点,翻转链表,合并链表,打包放送。解决方法:1:列表存节点+原创 2020-10-20 16:49:45 · 555 阅读 · 0 评论 -
Leetcode题63、不同路径III(Python题解)美团面试题
问题:题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/unique-paths-iii/难度:困难分析:相比于不同路径I和不同路径II,不同路径III增加了三个要求,一是可以在4个方向上行走,二是不允许走回头路的要求,三是每个路径都需要包含所有无障碍方格。这里用回溯法解比较易懂。首先遍历网格找到起始点,然后再4个方向上进行搜索。搜索的时候注意,每条路径走过一个网格后将将其标记为-1(障碍),这样就保证了不允许走回头路的条件,搜索下原创 2020-10-15 17:22:12 · 361 阅读 · 0 评论 -
Leetcode题236、二叉树的最近公共祖先(Python题解)Facebook面试题
问题:题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/难度:中等分析:递归理解的一道经典题目。思路一:递归首先写终止条件,没找到节点,返回空。然后写,如果找到指定节点了,需要终止,并回传节点。回传节点特别重要,当遇到某个父节点接受到来自left和right的回传值,那么就更新回传值为此父节点。如果没有这种情况,则将回传值不断向父节点回传,保证最后得到的原创 2020-10-15 16:28:42 · 369 阅读 · 0 评论 -
常见python面试题(None为什么用is,is和==的区别等)
问题:反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL进阶:你可以迭代或递归地反转链表。你能否用两种方法解决这道题?题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/reverse-linked-list难度:简单分析:使用迭代和递归两种方法实现解决方法:1:迭代...原创 2020-10-13 16:26:33 · 933 阅读 · 0 评论 -
Leetcode123、买卖股票的最佳时机III(Python题解)买两次,字节跳动面试题
问题:题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iii/难度:困难分析:本题提供两种解法1、将第一次买卖挣到的钱作为第二次买卖的本金,最终的目的是使第二次交易结束后手里赚到的钱最多,不单独考虑一次买卖的盈利。2、将数组分割为两部分,寻找使得两部分利润和最大的分割点。解决方法:1:#用第一次的钱抵消一部分第二次买的钱class Solution: d原创 2020-10-11 14:25:20 · 388 阅读 · 0 评论 -
Leetcode122、买卖股票的最佳时机II(Python题解)不限买卖次数,字节跳动面试题
问题:题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/难度:简单分析:本题提供两种解法1、贪心。只要后一天比前一天价格高就买卖。2、谷底买入,峰顶卖出用一个变量记录谷底,用一个flag判断是否持有股票。解决方法:1:贪心#贪心class Solution: def maxProfit(self, prices: List[int]) ->原创 2020-10-11 10:34:17 · 345 阅读 · 0 评论 -
Leetcode121、买卖股票的最佳时机(Python题解)只买一次,字节跳动面试题
问题:题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/难度:简单分析:只准买卖一次,相当于寻找最大上升子序列的最小值和最大值。解决方法:1:记录最小值,不断更新最大值。#记录最小值,更新最大值class Solution: def maxProfit(self, prices: List[int]) -> int: max_profit原创 2020-10-11 10:15:15 · 371 阅读 · 1 评论 -
Leetcode213、打家劫舍II(Python题解)字节跳动面试题
问题:题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/house-robber-ii/难度:中等分析:相对于打家劫舍I的变化是将房子变成了环形,这就导致我们的首尾要单独处理。如果抢第一家,那么最后一家一定不能抢,如果抢最后一家,那么第一家不能抢。那么我们可以把情况分为第一家不抢,计算其他家最大值和最后一家不抢计算其他家最大值,打破环形结构带来的约束。首尾两家不可能同时被抢,我们不用担心这种情况被遗漏。首尾两家可能同时都不被抢,这在两种情况原创 2020-10-10 15:03:08 · 489 阅读 · 0 评论 -
Leetcode198、打家劫舍(Python题解)字节跳动面试题
问题:题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/unique-paths-ii/难度:中等分析:经典的动态规划题。与不同路径I的思路相同,多了一个约束条件:网格中可能存在障碍物。当网格中有障碍物的时候,说明这个网格对于路径数量的贡献度为0,将这个格子置0即可。解决方法:1:二维DP递推公式为if obstacleGrid[i][j] == 0:dp[i][j] = dp[i] [j - 1] + dp[i - 1][j]原创 2020-10-10 14:35:26 · 470 阅读 · 0 评论 -
Leetcode题120、三角形最小路径和(Python题解)字节跳动面试题
问题:题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/triangle/难度:中等分析:动态规划题。这个题的递推公式不难找,需要注意的是每行的行首和行尾需要单独讨论。还有一点是,在做空间优化的时候是从后向前迭代的。递推公式:dp[i][j] = min(dp[i - 1][j - 1], dp[i - 1][j]) + triangle[i][j]每行首尾处理:dp[i][0] = dp[i - 1][0] + triangle[原创 2020-10-10 10:56:32 · 479 阅读 · 1 评论 -
Leetcode题74、搜索二维矩阵(Python题解)Amazon面试题
问题:题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/walking-robot-simulation/难度:中等分析:两个思路:1、二分查找,关键地方在于求中点时行数用整除求,列数用取余求。2、右上或左下角法,以右上角为例,观察右上角,右上角的值是行最大值和列最小值,可以用来做交界值。当目标值大于右上角值时,可以删除本行;当目标值小于右上角值时,可以删除本列。解决方法:1:二分查找class Solution: def原创 2020-10-10 10:11:19 · 376 阅读 · 1 评论 -
正方形问题及python实现。leetcode1277(统计全为1的正方形子矩阵)、leetcode221(最大正方形)(python题解)华为面试题
问题:动态规划问题,但是这个DP问题的递推公式需要数学推导一下。官方题解对于这个问题的证明还是比较清楚的。链接:https://leetcode-cn.com/problems/count-square-submatrices-with-all-ones/solution/tong-ji-quan-wei-1-de-zheng-fang-xing-zi-ju-zhen-2/一、统计全为1的正方形子矩阵(leetcode1277)问题:题目来源:力扣(LeetCode)链接:https://le原创 2020-10-09 21:03:06 · 672 阅读 · 0 评论 -
螺旋矩阵及python实现。leetcode54、leetcode59、leetcode885(python题解)华为笔试题
问题:数组的螺旋遍历,逻辑模拟,主要技巧在于四个方向的控制。一、螺旋矩阵(leetcode54)问题:题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/spiral-matrix/难度:中等分析:python的zip技巧很妙,zip本身就带方向旋转的特性。常规思路主要要写对方向。解决方法:1:python技巧class Solution: def spiralOrder(self, matrix: List[List[i原创 2020-10-09 20:04:20 · 772 阅读 · 0 评论 -
Leetcode91、解码方法(Python题解)字节跳动面试题
问题:题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/decode-ways/难度:中等分析:注:提示里的s可以包含前导0的意思是给定的s中可能有前导0,但解码出来的字母不可以有前导0,例如“02”的解码方法总数为0。解决方法:1:DP本题是一维DP,但情况比较多。本题中的解法方法分为一位数可解码和两位数可解码,我们先假设所有的一位数和两位数都是合法的,那么到第i位时的解码方法数就可以写为dp[i] = dp[i - 1] + d原创 2020-10-08 20:49:22 · 551 阅读 · 0 评论 -
Leetcode题72、编辑距离(Python题解)字节跳动面试题
问题:题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/edit-distance/难度:困难分析:经典的动态规划题。一个小技巧,在DP表的第一行和第一列添加辅助行和辅助列,这样就免去了初始化时的麻烦。本题可以从辅助行和辅助列得到需要的base case,所以可以使用这个技巧。解决方法:1:二维DP递推公式:if word1[i - 1] == word2[j -1]:dp[i][j] = dp[i][j] = dp[i - 1]原创 2020-10-08 16:16:43 · 482 阅读 · 0 评论 -
Leetcode题64、最小路径和(Python题解)Amazon面试题
问题:题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/minimum-path-sum/难度:中等分析:和不同路径的思路一致。Tips:1、本题依旧无法使用辅助行和辅助列,因此乖乖自己初始化第一行和第一列。2、本题的递推公式为dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j],当前格子值只依赖临近的两个格子的值,因此可以将空间优化到O(n)。解决方法:1:二维DP递推原创 2020-10-08 14:52:11 · 393 阅读 · 0 评论 -
Leetcode题53、最大子序和(Python题解)字节跳动面试题
问题:题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/maximum-subarray/难度:简单分析:可以用DP和分治做。在本题中分治的做法更复杂、时间更长,但在某些背景下却被认为是更优的做法。这是为什么呢?因为分治法不仅可以解决区间[0, n - 1]的问题,还可以解决任意区间[l, r]的问题。如果在计算过程中将结果用堆都存储下来。那么就可在O(logn)的时间内求取任意时间的答案。解决方法:1:常规思路用两个值记录遍历原创 2020-10-08 11:09:44 · 317 阅读 · 1 评论 -
Leetcode题1143、最长公共子序列(Python题解)字节跳动面试题
问题:题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/longest-common-subsequence/难度:中等分析:经典的动态规划题。一个小技巧,在DP表的第一行和第一列添加辅助行和辅助列,这样就免去了初始化时的麻烦。本题可以从辅助行和辅助列得到需要的base case,所以可以使用这个技巧。解决方法:1:二维DP递推公式为if text1[i - 1] == text2[j - 1]:dp[i][j] = dp[i原创 2020-10-07 22:13:30 · 568 阅读 · 0 评论 -
Leetcode题874、模拟行走机器人(Python题解)
问题:题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/walking-robot-simulation/难度:简单分析:逻辑模拟。几个小技巧:1、list是顺序查找,set是哈希查找,所以set会很快。set实际上是一个没有value的字典,因此set的值要求唯一并且是不可变类型。2、逻辑模拟按照逻辑走就可以,找好状态以及状态转换方式。状态空间的寻找很重要。本题中有4个状态,分别面向上、下、左、右,对应4个操作,x方向前进,y方原创 2020-10-07 21:21:50 · 373 阅读 · 0 评论 -
Leetcode题63、不同路径II(Python题解)美团面试题
问题:题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/unique-paths-ii/难度:中等分析:经典的动态规划题。与不同路径I的思路相同,多了一个约束条件:网格中可能存在障碍物。当网格中有障碍物的时候,说明这个网格对于路径数量的贡献度为0,将这个格子置0即可。解决方法:1:二维DP递推公式为if obstacleGrid[i][j] == 0:dp[i][j] = dp[i] [j - 1] + dp[i - 1][j]原创 2020-10-06 19:55:49 · 328 阅读 · 0 评论 -
Leetcode题62、不同路径(Python题解)微软面试题
问题:题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/unique-paths/难度:中等分析:经典的动态规划题。动态规划与递归紧密相连,递归是自顶向下,不断压栈,压到最后一层之后开始向回计算。动态规划是直接从底层向上计算,省去了压栈的空间和重复计算的时间。递归可以用memo优化时间。动态规划步骤:第一步,先找状态空间!!这很重要,找到状态空间表示问题所有的状态。第二步写递推公式!第三步写base case!本题递归的思路:原创 2020-10-06 11:28:00 · 457 阅读 · 0 评论 -
从二叉树的前、中、后序遍历中构造二叉树及python实现。leetcode105、leetcode106、leetcode889(python题解)
问题:从二叉树的前、中、后遍历中构造二叉树及其python实现,整理了当模板。对遍历顺序疑惑的推荐另一个博主的文章:https://blog.youkuaiyun.com/qq_33243189/article/details/80222629一、从前序与中序遍历序列构造二叉树(leetcode105)问题:题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-原创 2020-10-04 16:10:21 · 977 阅读 · 5 评论 -
Leetcode题160、相交链表(Python题解)
问题:题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists/难度:简单分析:这竟然是到简单题emm,code确实挺简单的,但是思路不是一下子就能想到的啊。思路一、哈希。将链表1的的节点存下来,依次检查链表2中是否有节点在链表1中。但这种方法无法满足O(1)的空间复杂度。思路二、拼接链表法。见下面的图。解决方法:1:哈希class Solution: def g原创 2020-10-04 15:48:23 · 341 阅读 · 0 评论 -
Leetcode题40、组合总和II(Python题解)
问题:题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/combination-sum-ii/难度:中等分析:回溯法。题目中有重复元素,需要进行去重。首先元素需要排序,然后每次遇到重复的值即跳过,并且保证备选数组的第一个值永远是可选的,i > index。解决方法:1:回溯法class Solution: def combinationSum2(self, candidates: List[int], target:原创 2020-10-04 10:12:10 · 341 阅读 · 1 评论