Leetcode
leetcode部分题解
zhulf0804
点云,深度学习
展开
-
5639. 完成所有工作的最短时间
Leetcode 周赛223的hard题目,此题是我见到的很惊艳的题目,用到了二进制表示状态,枚举状态,二分法,动态规划等知识,值得记录一下。看到这个题目时,只能想到二分法,看了题解后才发现这个是二分 + 状压dp的题目。看了题解,发现这个题目的实现用了很多二进制表示,其中最为精辟的是枚举状态,结合https://oi-wiki.org/math/bit/#_14勉强看懂代码。下面是python3的代码实现,但是tle了,看了下面的评论说是此题对python不友好,下次再用C++把这个题目实现一下吧。原创 2021-01-10 23:44:18 · 635 阅读 · 0 评论 -
695. 岛屿的最大面积
给定一个包含了一些0和1的非空二维数组grid,一个岛屿是由四个方向(水平或垂直)的1(代表土地)构成的组合。你可以假设二维矩阵中的四个边缘都被水围绕着。找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为0)示例 1:[[0,0,1,0,0,0,0,1,0,0,0,0,0], [0,0,0,0,0,0,0,1,1,1,0,0,0], [0,1,1,0,1,0,0,0,0,0...原创 2019-10-14 15:17:24 · 148 阅读 · 0 评论 -
84.柱状图中最大的矩形
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。示例:输入: [2,1,5,6,2,3]输出: 10思路1: 暴力, 超出内存计算任意两个位置i, j之间的最大矩形面积dp[i][j]记录(i, j)之间的最小高度# 超出内存限制class Solution: def large...原创 2019-10-03 15:48:51 · 182 阅读 · 0 评论 -
95. 不同的二叉搜索树 II
给定一个整数 n,生成所有由 1 … n 为节点所组成的二叉搜索树。示例:输入: 3输出:[ [1,null,3,2], [3,2,null,1], [3,1,null,null,2], [2,1,3], [1,null,2,null,3]]解释:以上的输出对应以下 5 种不同结构的二叉搜索树: 1 3 3 2 ...原创 2019-10-03 12:54:06 · 99 阅读 · 0 评论 -
98. 验证二叉搜索树
假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例 1:输入: 2 / \ 1 3输出: true示例 2:输入: 5 / \ 1 4 / \ 3 6输出: false解释: 输入为: [5,1,4,null...原创 2019-10-03 11:45:15 · 100 阅读 · 0 评论 -
128. 最长连续序列
给定一个未排序的整数数组,找出最长连续序列的长度。要求算法的时间复杂度为 O(n)。示例:输入: [100, 4, 200, 1, 3, 2]输出: 4解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。思路1: 暴力 O(n^2), 哈希查找遍历nums中的每一个元素item,判断以它作为开始元素的最长递增序列依次判断item + 1是否在nums数组中...原创 2019-10-02 16:25:43 · 123 阅读 · 0 评论 -
406. 根据身高重建队列
假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。注意:总人数少于1100人。示例输入:[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]输出:[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]...原创 2019-10-01 20:48:55 · 105 阅读 · 0 评论 -
4. 寻找两个有序数组的中位数
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空。示例 1:nums1 = [1, 3]nums2 = [2]则中位数是 2.0示例 2:nums1 = [1, 2]nums2 = [3, 4]则中位数是 (2 +...原创 2019-10-01 17:41:30 · 117 阅读 · 0 评论 -
23. 合并K个排序链表
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。示例:输入:[ 1->4->5, 1->3->4, 2->6]输出: 1->1->2->3->4->4->5->6思路1: 一种直观的想法,list[0]和list[1]合并,然后再和list[2]合并… 一直到最后一个list。 ...原创 2019-10-01 14:42:45 · 108 阅读 · 0 评论 -
85. 最大矩形
给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。示例:输入:[ ["1","0","1","0","0"], ["1","0","1","1","1"], ["1","1","1","1","1"], ["1","0","0","1","0"]]输出: 6这个题目看到后有两个思路,一个是暴力,时间复杂度为O(M3*N3), 另一...原创 2019-10-03 23:11:02 · 121 阅读 · 0 评论 -
127. 单词接龙
给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则:每次转换只能改变一个字母。转换过程中的中间单词必须是字典中的单词。说明:如果不存在这样的转换序列,返回 0。所有单词具有相同的长度。所有单词只由小写字母组成。字典中不存在重复的单词。你可以假设 beginWord 和 en...原创 2019-10-04 11:32:00 · 116 阅读 · 0 评论 -
76. 最小覆盖子串
给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串。示例:输入: S = "ADOBECODEBANC", T = "ABC"输出: "BANC"说明:如果 S 中不存这样的子串,则返回空字符串 “”。如果 S 中存在这样的子串,我们保证它是唯一的答案。思路1: 暴力, 超时,通过了 226 / 268 个测试用例from collec...原创 2019-10-04 15:48:39 · 171 阅读 · 0 评论 -
334. 递增的三元子序列
给定一个未排序的数组,判断这个数组中是否存在长度为 3 的递增子序列。数学表达式如下:如果存在这样的 i, j, k, 且满足 0 ≤ i < j < k ≤ n-1,使得 arr[i] < arr[j] < arr[k] ,返回 true ; 否则返回 false 。说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1) 。示例 1:输入: [...原创 2019-10-04 17:08:34 · 126 阅读 · 0 评论 -
10. 正则表达式匹配
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。说明:s 可能为空,且只包含从 a-z 的小写字母。p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。示例 1:输入:s = "aa"p...原创 2019-10-04 20:21:23 · 156 阅读 · 0 评论 -
312. 戳气球
有 n 个气球,编号为0 到 n-1,每个气球上都标有一个数字,这些数字存在数组 nums 中。现在要求你戳破所有的气球。每当你戳破一个气球 i 时,你可以获得 nums[left] * nums[i] * nums[right] 个硬币。 这里的 left 和 right 代表和 i 相邻的两个气球的序号。注意当你戳破了气球 i 后,气球 left 和气球 right 就变成了相邻的气球。求...原创 2019-10-04 21:48:09 · 124 阅读 · 0 评论 -
295. 数据流的中位数
中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。例如,[2,3,4] 的中位数是 3[2,3] 的中位数是 (2 + 3) / 2 = 2.5设计一个支持以下两种操作的数据结构:void addNum(int num) - 从数据流中添加一个整数到数据结构中。double findMedian() - 返回目前所有元素的中位数。示例:addNum(1...原创 2019-10-05 00:30:39 · 103 阅读 · 0 评论 -
297. 二叉树的序列化与反序列化
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。示例:你可以将以下二叉树: 1...原创 2019-10-05 01:28:29 · 112 阅读 · 0 评论 -
377. 组合总和IV
给定一个由正整数组成且不存在重复数字的数组,找出和为给定目标正整数的组合个数。示例:nums = [1, 2, 3]target = 4所有可能的组合为:(1, 1, 1, 1)(1, 1, 2)(1, 2, 1)(1, 3)(2, 1, 1)(2, 2)(3, 1)请注意,顺序不同的序列被视作不同的组合。因此输出为 7。思路: 看到这个题目,有两种思路,一个...原创 2019-10-08 15:26:07 · 150 阅读 · 0 评论 -
8. 字符串转换整数 (atoi)
请你来实现一个 atoi 函数,使其能将字符串转换成整数。首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。该字符串除了有效的整数部分之后也可能会存在多余的字...原创 2019-10-01 13:43:47 · 104 阅读 · 0 评论 -
124. 二叉树中的最大路径和
给定一个非空二叉树,返回其最大路径和。本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。示例 1:输入: [1,2,3] 1 / \ 2 3输出: 6示例 2:输入: [-10,9,20,null,null,15,7] -10 / \ 9 20 / \...原创 2019-10-01 12:36:04 · 236 阅读 · 0 评论 -
235-236. 二叉(搜索)树的最近公共祖先
给定一棵二叉(搜索)树,找到该树中两个指定节点的最近公共祖先.最近公共祖先的定义为: “对于有根树T的两个节点p、q,最近公共祖先表示为一个节点x, 满足x是p、q的祖先且x的深度尽可能大(一个节点也可以是它自己的祖先)”思路1:分别找到根节点到p和q的路径,路径中最后一个相同的就是最近公共祖先.class Solution: def lowestCommonAncestor(sel...原创 2019-09-27 12:34:37 · 170 阅读 · 0 评论 -
204.计数质数
统计所有小于非负整数 n 的质数的数量。示例:输入: 10输出: 4解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。这个题目思路很简单,但是可能效率不高,里面有一些小trick需要注意,所以在这里记录一下优化过程。思路1: 逐个判断每个数是否质数, (超时)class Solution: def countPrimes(self, n: int)...原创 2019-09-27 17:10:57 · 182 阅读 · 0 评论 -
438. 找到字符串中所有字母异位词
给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。说明:字母异位词指字母相同,但排列不同的字符串。不考虑答案输出的顺序。示例 1:输入:s: "cbaebabacd" p: "abc"输出:[0, 6]解释:起始索引等于 0 的子串是 ...原创 2019-09-27 18:01:03 · 77 阅读 · 0 评论 -
103. 二叉树的锯齿形层次遍历
给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。例如:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回锯齿形层次遍历如下:[ [3], [20,9], [15,7]]看到本题目,首先想到的是使用队列或栈,...原创 2019-09-28 09:57:18 · 242 阅读 · 0 评论 -
179. 最大数
给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数。示例 1:输入: [10,2]输出: 210示例 2:输入: [3,30,34,5,9]输出: 9534330说明: 输出结果可能非常大,所以你需要返回一个字符串而不是整数。此题目思路不难,重点就是一个排序,同时要注意:只有[0, 0, 0]的情况python3的排序函数没有cmp的情况具体程序参考如下:f...原创 2019-09-28 12:07:45 · 115 阅读 · 0 评论 -
131. 分割回文串
这个题目一看到时一脸懵逼,没有思路… 但是我不能放弃,就慢慢的找寻思路.首先想到了, 我可以算得任意两个位置i,j之间的字符串是否是回文子串(用动态规划即可算得)然后,我发现可以把问题进行分解:分割出"a", 如果"a"是回文,则继续分割子串"ab" (相似的子问题)分割出"aa", 如果"aa"是回文,则继续分割子串"b" (相似的子问题)分割出"aab", 如果"aab"是回文,...原创 2019-09-28 15:15:40 · 102 阅读 · 0 评论 -
350.两个数组的交集II
给定两个数组,编写一个函数来计算它们的交集。示例 1:输入: nums1 = [1,2,2,1], nums2 = [2,2]输出: [2,2]示例 2:输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出: [4,9]说明:输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。我们可以不考虑输出结果的顺序。思路1: 首先想到...原创 2019-09-28 17:27:28 · 67 阅读 · 0 评论 -
134. 加油站
在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。说明:如果题目有解,该答案即为唯一答案。输入数组均为非空数组,且长度相同。输入数组中的元素均为...原创 2019-09-28 21:59:45 · 63 阅读 · 0 评论 -
454. 四数相加
给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N,且 0 ≤ N ≤ 500 。所有整数的范围在 -228 到 228 - 1 之间,最终结果不会超过 231 - 1 。例如:输入:A = [ 1, 2]...原创 2019-09-29 10:48:43 · 217 阅读 · 0 评论 -
380. 常数时间插入、删除和获取随机元素
设计一个支持在平均 时间复杂度 O(1) 下,执行以下操作的数据结构。insert(val):当元素 val 不存在时,向集合中插入该项。remove(val):元素 val 存在时,从集合中移除该项。getRandom:随机返回现有集合中的一项。每个元素应该有相同的概率被返回。示例 :// 初始化一个空的集合。RandomizedSet randomSet =...原创 2019-09-29 13:46:14 · 229 阅读 · 0 评论 -
146. LRU缓存机制
运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最少使用的数...原创 2019-09-29 16:43:29 · 98 阅读 · 0 评论 -
378. 有序矩阵中的第K小的元素
给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素。请注意,它是排序后的第k小元素,而不是第k个元素。示例:matrix = [ [ 1, 5, 9], [10, 11, 13], [12, 13, 15]],k = 8,返回 13。说明:你可以假设 k 的值永远是有效的, 1 ≤ k ≤ n2 。思路1: 这个题目只想到...原创 2019-09-29 17:09:00 · 87 阅读 · 0 评论 -
189. 旋转数组
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。示例 1:输入: [1,2,3,4,5,6,7] 和 k = 3输出: [5,6,7,1,2,3,4]解释:向右旋转 1 步: [7,1,2,3,4,5,6]向右旋转 2 步: [6,7,1,2,3,4,5]向右旋转 3 步: [5,6,7,1,2,3,4]示例 2:输入: [-1,-100,3,99] 和 ...原创 2019-09-30 00:30:00 · 75 阅读 · 0 评论 -
221. 最大正方形
在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。示例:输入: 1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0输出: 4思路1: 暴力法, 遍历二维矩阵,在任一位置(i, j)计算以(i, j)开始的包含1的最大矩形,时间复杂度O(mn*min(m,n)), 下面是题主写的一份很垃圾的代码import numpy ...原创 2019-09-30 16:07:11 · 77 阅读 · 0 评论 -
287. 寻找重复数
给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。示例 1:输入: [1,3,4,2,2]输出: 2示例 2:输入: [3,1,3,4,2]输出: 3说明:不能更改原数组(假设数组是只读的)。只能使用额外的 O(1) 的空间。时间复杂度小于 O(n2) ...原创 2019-09-30 20:14:41 · 141 阅读 · 0 评论 -
239. 滑动窗口最大值
给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。示例:输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值-----------...原创 2019-09-30 22:29:38 · 85 阅读 · 0 评论 -
394. 字符串解码
给定一个经过编码的字符串,返回它解码后的字符串。编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的...原创 2019-10-01 00:05:05 · 204 阅读 · 0 评论 -
230. 二叉搜索树中的第K小元素
给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。说明:你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。示例 1:输入: root = [3,1,4,null,2], k = 1 3 / \ 1 4 \ 2输出: 1示例 2:输入: root = [5,3,6,2,4,null,null,1], k ...原创 2019-09-27 10:31:44 · 98 阅读 · 0 评论