LeetCode
咆哮的阿杰
吾生也有涯,而知也无涯
展开
-
LeetCode: 214.最短回文串 &1312.让字符串成为回文串的最少插入次数
214.最短回文串题目:给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。注意: 要求在字符串前面加入一个字符串,使得新字符串是回文,且长度是最短的。题目也可以改成从尾部加入解法其实目的就是在s中找到一个以头部字符为起点的最长回文串s1,然后s2(s中不是s1的部分)翻转贴到s的前面就完事了。但是复杂度是O(n**2), 有一种马拉车算法能到O(N)。 这里不介绍。class Solution: def shortestPali原创 2020-09-06 20:28:03 · 1035 阅读 · 0 评论 -
LeetCode:116. 填充每个节点的下一个右侧节点指针 & 117 填充每个节点的下一个右侧节点指针||
这两道题是相关系的。给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:struct Node { int val; Node *left; Node *right; Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有 next 指针都被设置为 NULL。I 和 II 的区别在于给定的二叉树是否是完美二叉树还是任意二叉树。如果是原创 2020-08-15 20:54:42 · 170 阅读 · 0 评论 -
LeetCode: 473.火柴拼正方形
题目:还记得童话《卖火柴的小女孩》吗?现在,你知道小女孩有多少根火柴,请找出一种能使用所有火柴拼成一个正方形的方法。不能折断火柴,可以把火柴连接起来,并且每根火柴都要用到。输入为小女孩拥有火柴的数目,每根火柴用其长度表示。输出即为是否能用所有的火柴拼成正方形思路我看到题目,很快就想到了等分k份数组这道题目.两道题目几乎就是一样的。首先要对nums逆序排序(非常重要),因为这样回溯更快。优选选择长度大的火柴,很快就能得出火柴被分配到第k个边是否可以。class Solution: def原创 2020-08-10 22:37:07 · 274 阅读 · 0 评论 -
LeetCode:61.旋转链表
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。示例 1:输入: 1->2->3->4->5->NULL, k = 2输出: 4->5->1->2->3->NULL解法首先把尾巴和头部连在一起,顺便求出总长leng,leng - k % leng 就是新的链表的头部位置# Definition for singly-linked list.# class ListNode:# def __in原创 2020-08-03 22:00:05 · 149 阅读 · 0 评论 -
LeetCode: 435.无重叠区间
题目:给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。这道题和合并区间有点类似。但合并区间要求求出合并之后的区间集合。这道题是要你删除最小数量的一些区间,使得剩下的区间不重合。解法暴力:我们当然可以遍历所有不重叠的区间组合,然后用删除前总集合数目-剩下的区间数目,就是删除的数目。取最小就行了(超时)动态规划(超时)。我们先对每个集合的第一个地址排序(一般涉及区间都是先按第一个元素或者第二个元素排序)。dp[i]记录前i个区间使之不重叠的最小删除区间数目。class原创 2020-08-02 11:15:30 · 431 阅读 · 0 评论 -
LeetCode: 560. 和为k的子数组
给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。暴力法直观的解法是暴力法,但暴力法的复杂度是N3, 前两重for循环是快慢指针遍历每一个子数组,第三个for循环是求和。改进的暴力法:巧用前缀和前缀和问题已经不止出现一次了。如果我们记录了前i个数字的和,那么求(j,i)这一段的和就只用一次减法。我们可以把时间复杂度降低至N2.哈希表: On的解法如果我们用哈希表记录前缀和出现的次数,如果pre[i] -k出现在哈希表中,其实我们就找到了和为k的子数组,且次数就是c原创 2020-07-16 23:02:03 · 197 阅读 · 0 评论 -
LeetCode: 深度优先遍历搜索&广度搜索专题
1091.二进制矩阵中的最短路径题目: 一个格子,填充0或者1.只能走0的位置。从左上角到右下角最短的路径长度。如果没有这样的路径,返回-1。 可以从8个方向走。思路:最短路径的问题,如迷宫啦,都是BFS。同时要标记走过的路径,不要重复走了;从(0,0)走,先走一步,把8个方向都做一遍,同时新的地方的值为0,则是合法的位置,入队。在入队之前,判断一下是否已经走到终点了。from collections import dequeclass Solution: def shortest原创 2020-07-07 18:03:19 · 287 阅读 · 0 评论 -
先序遍历、中序遍历、后序遍历的迭代写法(python)
深度优选遍历有三种形式,先序遍历、中序、后序遍历。我们一般是用递归写的,因为好写也好理解。但偏偏在面试的时候,面试官可能要我们写迭代的写法。先序遍历的迭代写法很好写。但是另外两种就没那种容易一下就写出来的。参考了leetcode解法,这里总结一下。统一的框架先序遍历class Solution: def preorderTraversal(self, root: TreeNode) -> List[int]: stack = [] if not root原创 2020-07-06 00:04:31 · 1427 阅读 · 0 评论 -
LeetCode: 76.最小覆盖子串
题目给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。示例:输入: S = “ADOBECODEBANC”, T = “ABC”输出: “BANC”说明:如果 S 中不存这样的子串,则返回空字符串 “”。如果 S 中存在这样的子串,我们保证它是唯一的答案。思路双指针滑窗法。 左右指针最开始都在0, 右指针遍历元素。每一次迭代都判断左右指针之间的字符是否已经包含了S中的字符,且数量是大于等于的。碰到字符串,而且短时间无法想到解决办法,那就想原创 2020-07-01 23:29:58 · 467 阅读 · 0 评论 -
LeetCode: 08.11 硬币 & 518. 零钱兑换||
完全背包问题,即资源没有数量限制题目硬币。给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。(结果可能会很大,你需要将结果模上1000000007)解法根据背包九讲里面的完全背包的递推公式,可以简化时间复杂度。本来完全背包问题可以拆分为01背包,但是就多出一个for循环。dp[i][j]描述了只用前i个硬币, 能拼出钱j的方案数目。初始化的话,如果只用一分硬币,那所有钱数只有一种方案。注意。第二维是n+1的长度,且第一位初始化为1,因为如果j - coin==0,原创 2020-06-09 00:38:14 · 249 阅读 · 0 评论 -
LeetCode:43 字符串相乘
题目给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。思路之前做过一个字符串加法的。当然乘法的复杂度远远高于加法。我们算乘法,是写竖式的。上面这个竖式和我们平时列的还不太一样,但这样列更加容易编程实现。解释一下,用一个数组res保存num2中的一个字符和num1所有字符的乘积;然后得到的结果,综合一下之前的计算结果。class Solution: def multiply(self, num1: str,原创 2020-06-16 21:42:52 · 191 阅读 · 0 评论 -
LeetCode:接雨水
题目给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水思路暴力法每个位置i能装的雨点数目,是由0-i1 这一段的最大值和i+1-n-1这一段的最大值,这两边的最大值中的较小值- height[i]得到的。因此遍历到一个位置,就用两个for分别寻找左右两边的最大值。化简的暴力法我们还可以先遍历一遍数组,统原创 2020-06-15 21:47:55 · 336 阅读 · 0 评论 -
LeetCode: 22.括号生成
题目数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合.输入:n = 3输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]思路这道题和判断是否是有效的括号字符串,都是和括号打交道的。我们可以基于判断是否是有效括号字符串的解法做。暴力法用回溯生成所有组合,依次判断是否是有效括号字符串(总长度为2*n)。判读的解法我之前做过,用栈或者一个变量记录左括号的数目即可。当然有化简的暴力法化简的暴原创 2020-06-14 22:55:17 · 238 阅读 · 0 评论 -
LeetCode: 1143.最长公共子序列
题目给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。若这两个字符串没有公共子序列,则返回 0。解法我应该是在快手的2020实习生招聘见过这道题目。当时没做出来,题目原创 2020-06-13 16:13:24 · 226 阅读 · 0 评论 -
LeetCode: 718.最长重复子数组
题目给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。凡是标定子树组,就是数字必须连续。而子序列,则没有这个要求。比如其他题目:最长回文子序列,最长公共子序列,最长递增子序列等等解法滑窗法首先想到的就是滑动法,就像卷积一样,其中一个序列从另一个数组的左边一直滑到右边,然后交叠部分挨个比较。分三部分:1. 序列A逐渐全部走进序列B。2. 序列A完全在B中滑动。3.序列A逐渐离开Bclass Solution: def findLength(self, A:原创 2020-06-13 14:32:37 · 238 阅读 · 0 评论 -
LeetCode: 99.恢复二叉搜索树
题目二叉搜索树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。思路在中序遍历的过程中,保存不在增序的节点,一旦找到直接退出递归。然后更换这两个节点的值class Solution: def recoverTree(self, root: TreeNode) -> None: """ Do not return anything, modify root in-place instead. """ x原创 2020-06-11 19:34:06 · 158 阅读 · 0 评论 -
LeetCode: 98.验证二叉搜索树
题目给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。就是看一颗是是否满足二叉搜索树。思路剑指里面有一道是判断一个序列是否是某二叉搜索树的中续遍历。一种简单的思路就是先中续遍历一遍,然后用剑指的办法判断。但经验告诉我,如果该树是二叉搜索树,我们需要走完所有的节点才能确定。但一旦某个节点不满足二叉搜索子树,我们是直接能得出整棵树都不是二原创 2020-06-11 17:18:14 · 250 阅读 · 0 评论 -
LeetCode: 887.鸡蛋掉落问题
著名的面试算法题目,我却不知道(2020VIVO提前批第二题)。题目你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N 共有 N 层楼的建筑。每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去。你知道存在楼层 F ,满足 0 <= F <= N 任何从高于 F 的楼层落下的鸡蛋都会碎,从 F 楼层或比它低的楼层落下的鸡蛋都不会破。每次移动,你可以取一个鸡蛋(如果你有完整的鸡蛋)并把它从任一楼层 X 扔下(满足 1 <= X <= N)。你的目标是确切地知道 F原创 2020-06-11 15:12:17 · 340 阅读 · 0 评论 -
LeetCode: 739.每日温度
题目根据每日 气温 列表,请重新生成一个列表,对应位置的输出是需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替。例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。思路一开始想到的是暴力法,就是第i个值要和后面的值去比较。但这样的复杂度是O(N2)O(N^2)O(N2)。然后想是不是能考虑前缀和,因为有比较的地方,但发现也不合适,因为原创 2020-06-11 11:52:23 · 240 阅读 · 0 评论 -
LeetCode 673.最长递增子序列的个数
这道卡了我一天的题目。我自己想的思路是对的,但是没能从纷杂的if else中得到正确的结果,最后还是向官方题解妥协了。题目给定一个未排序的整数数组,找到最长递增子序列的个数。不要求子序列是连续的。思路最开始我设想用一维dp数组,dp[i]代表从0-i这一段最长子序列的个数,发现并不好找递归方程。因为从i倒着比较0-i-1这些位置的最长子序列,只有最长子序列的个数(count)是不够的,起码还得知道最长子序列是有多长吧(length)。于是设置length[i]为以i为结尾的最长子序列的长度,co原创 2020-06-10 23:34:33 · 262 阅读 · 0 评论 -
LeetCode:698.划分为k个相等的子集
题目给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。思路回溯:因为每个元素都要用上,那取到和为target的一组值,就设置total为0重新取。递归终止条件是,当没有值可取且target等于total。一旦找到这样的集合,提前阻断,一直返回True注意:对nums从大到小排序,如果最大的大于target,直接返回False。节省时间。class Solution: def canPartitionKSubsets(self, nu原创 2020-06-04 22:54:38 · 353 阅读 · 0 评论 -
LeetCode 动态规划之三
494. 目标和先写了一段回溯class Solution: def findTargetSumWays(self, nums: List[int], S: int) -> int: n = len(nums) length = n cnt = 0 def walk(index, ss): nonlocal cnt if index == length and ss == S:原创 2020-05-17 23:34:56 · 565 阅读 · 0 评论 -
LeetCode动态规划之二
467. 环绕字符串中的唯一子串思路是dp[i]代表着从0-i这一段中符合规则出现的子串数目。 j从i-1开始往前走,直到不满足相邻,可以提前break,我没写出来。 如何判断相邻,我的办法是p[i] - p[i-1] == 1 and p[j+1] - p[j] == 1, 并且还要保证(p[i] - [j] + 26) % 26 == i - j下面这段代码,在这种情况下失败了, 比...原创 2020-04-01 23:47:56 · 379 阅读 · 0 评论 -
LeetCode之动态规划专题
因为疫情影响,无法回到学校,而电脑没带回家,用的是iPad刷题,打字也不方便,仅贴答案供自己学习用。原创 2020-02-25 18:42:16 · 285 阅读 · 1 评论 -
LeetCode: 一系列简单题
简单题不会再开单独的博客了,统一在这里做笔记。258. 各位相加给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。示例:输入: 38输出: 2解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2。 由于 2 是一位数,所以返回 2。class Solution: def addDigits(self, num: int) -> int...原创 2020-01-12 17:11:45 · 297 阅读 · 0 评论 -
LeetCode: 231. 2的幂
一个数是否是2的幂次,只要这个数字的二进制表示只有一个1,则这个数字是2的幂次。消除最低位的1的方式是n & (n-1),之前的题目也用过这个操作。2的幂次只有一个1,则满足n&(n-1)==0位运算,右移, 求1出现的次数。对于负数,直接返回Falseclass Solution: def isPowerOfTwo(self, n: int) -> bo...原创 2020-01-04 20:27:11 · 131 阅读 · 0 评论 -
LeetCode: 202.快乐数
题目:编写一个算法来判断一个数是不是“快乐数”。一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。示例:输入: 19输出: true解释:12 + 92 = 8282 + 22 = 6862 + 82 = 10012 + 02 + 02...原创 2019-12-30 22:40:31 · 244 阅读 · 0 评论 -
LeetCode: 217.存在重复的元素
给定一个整数数组,判断是否存在重复元素。如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。示例 1:输入: [1,2,3,1]输出: true示例 2:输入: [1,2,3,4]输出: false看到题目,重复的元素,我立刻就想起了之前做过的LeetCode.136, 但这题还不太一样。首先重复出现的次数是不定的,而且也不是只能有一...原创 2019-12-30 21:53:05 · 360 阅读 · 0 评论 -
LeetCode: 415.字符串相加
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。注意:num1 和num2 的长度都小于 5100.num1 和num2 都只包含数字 0-9.num1 和num2 都不包含任何前导零。你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。我总觉得之前做过一道类似的。十进制加法那就按照进位算吧,不需要位运算。class Solut...原创 2019-12-27 22:13:19 · 119 阅读 · 0 评论 -
LeetCode:251.数组中的第K个最大元素
题目:在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。解析无脑的做法先使用排序算法,然后线性时间取出第k大的元素即可。时间复杂度是O(NlogN)堆,也称为优先队列建一个大小为K的最大堆或者最小堆。遍历数组,把遍历到的值加入到堆当中,这个操作的时间复杂度是O(logK),遍历N次。总共是O(NlogK)使...原创 2019-12-25 23:12:48 · 197 阅读 · 0 评论 -
LeetCode: 414.第三大的数
题目:给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是O(n)。解析我的第一想法就是,用三次冒泡排序啊。复杂度就是o(3n)。但实际上还是采用了先总的排序,然后遍历寻找第三大的数字。(排序的复杂度是o(nlogn),外加几次常数级遍历操作)class Solution: def thirdMax(self, nums: List[i...原创 2019-12-20 23:07:30 · 256 阅读 · 0 评论 -
LeetCode: 405. 数字转换为16进制
给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算 方法。知识点:正数右移左边补0, 负数右移左边补1。 所以负数右移一直不会为0,需要用补码转到正数。解析第一种,辗转相除法数字如果小于0,则加上模。得到补码然后用辗转相除法就ok啦class Solution: def toHex(self, num: int) -> str...原创 2019-12-19 21:14:21 · 160 阅读 · 0 评论 -
LeetCode: 404.左叶子节点
计算给定二叉树的所有左叶子之和。示例:3/ \9 20/ \15 7在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24解析我们需要找到这样的节点属于叶子节点属于父节点的左子节点方法一:用栈,dfs遍历,用全局变量res作为累积和。遍历的过程中传递该节点是否是左子节点。同时判断左右子节点是否为None,则可以知道是不是左叶子节点。class S...原创 2019-12-15 19:18:18 · 376 阅读 · 0 评论 -
LeetCode: 401.二进制手表
题目:二进制手表顶部有 4 个 LED 代表小时(0-11),底部的 6 个 LED 代表分钟(0-59)。解析:有两种做法,本质一样,写法不同。第一种,遍历所有可能时间,看看1的个数。当1的个数等于num,则保存该时间。值得注意的是如何获得二进制值1的个数,之前的题目也有用到这个技巧。第二种,递归,深度回溯。有些复杂了。只看了题解。第一种class Solution: ...原创 2019-12-13 21:13:41 · 249 阅读 · 0 评论 -
LeetCode: 392. 判断子序列
题目:给定字符串 s 和 t ,判断 s 是否为 t 的子序列。你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。解析我看到这...原创 2019-12-12 19:57:08 · 172 阅读 · 0 评论 -
LeetCode·389. 找不同
题目:给定两个字符串 s 和 t,它们只包含小写字母。字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。请找出在 t 中被添加的字母。解析:异或法这道题和之前有一道找唯一的数字本质一样。t和s相比,多加了一个随机字符,除了这个随机字符,其他字符都应该和s中一样。换句话说,t和s总共加起来,只有那个随机字符的个数为奇数。一个数字和自身做异或为0,和0做异或等于自身。...原创 2019-12-11 20:03:48 · 230 阅读 · 0 评论 -
LeetCode:206.反转链表
反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL这道题我刚开始以为需要在原来的链表上修改,然后有了下面的代码,结果超时了。看题解才发现是可以返回值的。class Solution: def reverseList(self, head: ListNode)...原创 2019-12-09 20:30:16 · 122 阅读 · 0 评论 -
LeetCode: 191. 位1的个数
题目:编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。我的第一反应就是位与操作:判断数字的最低位是否为1,如果是,计数变量加1,数字右移动一位。因为python整型没有固定位数,所以要用模2322^{32}232来限制一下数值范围。对于无符号整数,模用2322^{32}232;对于有符号整数,模用2312^{31}231,也就是0...原创 2019-12-04 20:09:23 · 121 阅读 · 0 评论 -
LeetCode: 371.两整数之和
涉及到位运算的题目真是绕死了。题目:不使用运算符 + 和 - ,计算两整数 a 、b 之和。首先就想到看了是考察位运算的。之前的一道题目二进制求和 题解有些加法本质是异或运算加进位。异或运算本质是无进位的加法位与于运算求进位,但&之后的结果需要左移1位才行。因为涉及到负数,所以还要规定一下int32的位数,在python中,需要取模...原创 2019-12-02 23:05:53 · 173 阅读 · 0 评论 -
LeetCode: 367.有效的完全平方数
解法和69题很像。二分法:class Solution: def isPerfectSquare(self, num: int) -> bool: right = num // 2 +1 left = 1 if num == 1: return True while left < ri...原创 2019-12-01 22:26:52 · 359 阅读 · 0 评论