Leetcode
leetcode刷题,python
松语编程
公众号:松语编程。致力于分享Java编程技巧,个人思考,校招求职,工作规划,社招跳槽等方面的知识。
展开
-
355. 设计推特
思路见代码,注释很详细from typing import Listimport heapq # 使用堆来筛选最近发表的保温class Tweet: """推文类""" def __init__(self, tweet_id, cur_time): self.next = None # 连接下一条推特 self.id = tweet_i...原创 2020-02-24 17:30:53 · 189 阅读 · 0 评论 -
239. 滑动窗口最大值
思路1:暴力法时间复杂度:O(Nk)。其中 N 为数组中元素个数。空间复杂度:O(N−k+1),用于输出数组。class Solution: def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]: ans = [] window = [] for i in...原创 2020-02-24 11:21:09 · 80 阅读 · 0 评论 -
496. 下一个更大元素 I、739. 每日温度、503. 下一个更大元素 II、556. 下一个更大元素 III
思路1:单调栈先对 nums2 中的每一个元素,求出其下一个更大的元素。随后对于将这些答案放入哈希表中,再遍历数组 nums1,直接找出答案。(1) 先把第一个元素 nums2[1] 放入栈,(2) 对于 nums2[2],如果 nums2[2] > nums2[1], nums2[1] 出栈并把 nums2[2] 入栈;如果 nums2[2] <= nums2[1],我们就仅把...原创 2020-02-23 19:36:35 · 107 阅读 · 0 评论 -
146. LRU缓存机制
主要思路:需要字典实现快速查找,同时需要保证一定的顺序。带头尾节点的双向链表可以实现快速删除和添加头尾节点。因为节点的属性包括前一个节点和后一个节点,即使是中间的节点也可以实现快速删除。思路1: 使用orderedDict实现(可参考 python OrderedDict 详解)时间复杂度:O(1)。有序字典中的所有操作:get / in / set / move_to_end / popi...转载 2020-02-23 14:52:50 · 119 阅读 · 0 评论 -
500. 键盘行
思路1:暴力法判断后续字符是否和首字母字符在同一个集合class Solution: def findWords(self, words: List[str]) -> List[str]: set1 = set('qwertyuiop') # 注意不能写成{'qwertyuiop'} set2 = set('asdfghjkl') ...原创 2020-02-22 14:56:28 · 74 阅读 · 0 评论 -
435. 无重叠区间、452. 用最少数量的箭引爆气球
思路:可参考:贪心算法之区间调度问题这个图很容易理解。时间复杂度O(nlogn)空间复杂度O(1)class Solution: def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int: n = len(intervals) # 总数 if n<=1:ret...转载 2020-02-20 21:42:06 · 102 阅读 · 0 评论 -
877. 石子游戏
思路1:逻辑推理我们其实不需要一定拿到最优的组合实现总数最大,只要我们拿到的石子比对方多就胜利了。因为总数为奇数,那么不可能平分。对已石子堆:1,2,3,4,5,6,…,n,…2n-1,2n先手可以控制自己拿奇数堆或者偶数堆,这里面一定有一堆更多,这样就能够胜利。所以先手只要先算好就必胜。比如A先拿1,B就只能拿2或者2n,然后A可以拿2n-1或者3,肯定分别是奇数和偶数。class S...原创 2020-02-20 20:14:40 · 161 阅读 · 0 评论 -
516. 最长回文子序列
思路:参考:解答状态定义:dp[i][j]表示子序列s[i,j]的最长回文子序列状态转移:if s[i] == s[j]: dp[i][j] = dp[i + 1][j - 1] + 2 else: dp[i][j] = max(dp[i][j - 1], dp[i + 1][j])时间复杂度:O(n2)空间复杂度:O(n2)class Solution: ...转载 2020-02-20 16:58:18 · 93 阅读 · 0 评论 -
1143. 最长公共子序列
思路:动态规划dp[i][j] 表示text1的前i个数和text2的前j个数的公共子序列。时间复杂度:O(n2)空间复杂度:O(mn)def longestCommonSubsequence(str1, str2) -> int: m, n = len(str1), len(str2) dp = [[0] * (n + 1) for _ in range(m + ...原创 2020-02-20 16:14:07 · 147 阅读 · 1 评论 -
319. 灯泡开关
参考推理: 为什么平方数一定是亮着的?从数学角度证明结论:求n之内的平方数的个数思路1:求n之内的平方数的个数class Solution: def bulbSwitch(self, n: int) -> int: ans = 0 # 记录个数 num = 1 # while num*num<=n: ...原创 2020-02-19 21:59:32 · 138 阅读 · 0 评论 -
292. Nim 游戏
思路1:如果4个数,我们取1-3个,,那么剩下1-3个,对方可以取完。如果4n个数,我们取1-3个,,那么剩下4(n-1)+[1-3]个,对方可以取1-3个,重复进行,那么最后就是上面的情况,我们失败。因此,有一般性的定理,最后的数量只要不是4的倍数就行了。class Solution: def canWinNim(self, n: int) -> bool: ...原创 2020-02-19 21:26:56 · 66 阅读 · 0 评论 -
208. 实现 Trie (前缀树)、211. 添加与搜索单词 - 数据结构设计
class Trie: # 字典树,就是使用单词的每个字符作为键,后续字符字典作为值 def __init__(self): # 根是一个字典 self.root = {} def insert(self, word: str) -> None: # 依次插入子节点,若不存在则创建 node =se...原创 2020-02-19 17:11:58 · 107 阅读 · 0 评论 -
682. 棒球比赛
思路1:栈存前面的数,根据当前数决定操作时间复杂度O(n)空间复杂度O(n)class Solution: def calPoints(self, ops: List[str]) -> int: stack=[] for e in ops: if e=='+': stack.append(s...原创 2020-02-17 09:56:24 · 59 阅读 · 0 评论 -
844. 比较含退格的字符串
思路1:使用栈存放前面的字符 遇到#就退栈时间复杂度O(m+n):遍历两个字符串空间复杂度O(m+n):栈class Solution: def backspaceCompare(self, S: str, T: str) -> bool: return self.helper(S)==self.helper(T) def helper(self,S):...原创 2020-02-17 09:38:51 · 151 阅读 · 0 评论 -
1021. 删除最外层的括号
思路1:使用栈,栈空的时候,把遍历的这部分数据去掉两边加到结果集中。时间复杂度O(n):遍历空间复杂度O(n):栈class Solution: def removeOuterParentheses(self, S: str) -> str: tmpstack = [] ans = "" n = len(S) pr...原创 2020-02-16 22:37:26 · 65 阅读 · 0 评论 -
1047. 删除字符串中的所有相邻重复项
思路1:替换,使用字母集合时间复杂度O(N2):replace函数和while循环空间复杂度O(N):replace函数from string import ascii_lowercaseclass Solution: def removeDuplicates(self, S: str) -> str: words = {2*c for c in ascii_...原创 2020-02-16 22:12:16 · 75 阅读 · 0 评论 -
155. 最小栈
思路1:辅助栈,当然也可以使用排序使用个辅助栈来存储和栈底的值相等或更小的元素。注意一定要存相等的,否则,最小值会提前出栈。如果全部出栈了,自然没有最小值了。如果栈顶的值还在,自然能够保证能找到最小值增:比minstack的最小值小或相等,才往minstack增加,是非升序的删:删的数是最小数,那么minstack也要删除时间复杂度O(1)空间复杂度O(n):当所有的数相等是时候cl...原创 2020-02-16 21:17:39 · 87 阅读 · 0 评论 -
973. 最接近原点的 K 个点
思路1:排序按照距离对点进行排序,最后取指定数量的点。时间复杂度O(NlogN)空间复杂度O(1):原地class Solution: def kClosest(self, points: List[List[int]], K: int) -> List[List[int]]: return sorted(points, key=lambda x: x[0] ...原创 2020-02-16 19:10:01 · 93 阅读 · 0 评论 -
932. 漂亮数组
对于某些固定的 N,如果数组 A 是整数 1, 2, …, N 组成的排列,使得:对于每个 i < j,都不存在 k 满足 i < k < j 使得 A[k] * 2 = A[i] + A[j]。那么数组 A 是漂亮数组。给定 N,返回任意漂亮数组 A(保证存在一个)。解题思路:关于漂亮数组的性质:首先,不存在 k 满足 i < k < j 使得 A[k] *...原创 2020-02-16 16:40:20 · 187 阅读 · 0 评论 -
241. 为运算表达式设计优先级
思路:分治法不同位置添加括号的作用在于改变不同运算符的优先级。所以,可以在遍历的过程中依次把运算符设为第一优先级,递归计算左边和右边。class Solution: def diffWaysToCompute(self, input: str) -> List[int]: if input.isdigit(): # 全数字 return...原创 2020-02-16 16:00:58 · 129 阅读 · 0 评论 -
478. 在圆内随机生成点
思路:在圆的外接正方形范围内取点,若在园外,则重新选取。但是random.random()的范围是[0,1),所以这里稍微扩大了范围,才能取得边界值,因此可能慢些。import randomclass Solution: def __init__(self, radius: float, x_center: float, y_center: float): self...原创 2020-02-16 10:45:09 · 362 阅读 · 0 评论 -
470. 用 Rand7() 实现 Rand10()
思路1:根据rand7()产生的小范围数[1,7]组合成[1,10]。那么如何组合?直接组合好像没办法,那么考虑先组合出更大的范围,再取其中的小范围。rand7() =>(1,2,3,4,5,6,7)rand7()-1=>(0,1,2,3,4,5,6)[rand7()-1]*7=>(0,7,14,21,28,35,42)(rand7()-1)*7+rand7()-1=&...原创 2020-02-16 09:54:16 · 164 阅读 · 0 评论 -
74. 搜索二维矩阵、240. 搜索二维矩阵 II
74. 搜索二维矩阵思路:把二维数组看做是一维数组,而且是有序的,使用二分查找。时间复杂度O(log(mn))class Solution: def searchMatrix(self, matrix: List[List[int]], target: int) -> bool: def binarysearch(nums,left,right,target)...原创 2020-02-15 21:29:53 · 123 阅读 · 0 评论 -
169. 多数元素
思路1:计数数组-超内存时间复杂度O(n)空间复杂度O(max(nums))class Solution: def majorityElement(self, nums: List[int]) -> int: # 使用计数数组-超时 if len(nums) <= 2: return nums[0] maxval = max...原创 2020-02-15 20:16:11 · 86 阅读 · 0 评论 -
398. 随机数索引
思路:蓄水池抽样时间复杂度O(n)class Solution: def __init__(self, nums: List[int]): self.nums = nums def pick(self, target: int) -> int: # 对多个相同的元素以相同的概率输出,单个元素直接输出 import rand...原创 2020-02-15 19:40:45 · 75 阅读 · 1 评论 -
382. 链表随机节点
原理参考:蓄水池抽样——《编程珠玑》读书笔记思路:以1/m的概率选择第m个对象思路:class Solution: def __init__(self, head: ListNode): p = head self.vals = [] while p: self.vals.append(p.val) ...原创 2020-02-15 19:38:56 · 116 阅读 · 0 评论 -
1046. 最后一块石头的重量
思路1:使用heapq库构造小根堆。把石头的重量取负,构造小根堆。class Solution: def lastStoneWeight(self, stones: List[int]) -> int: import heapq stones = [-weight for weight in stones] # 取负 heapq....原创 2020-02-15 11:51:25 · 76 阅读 · 0 评论 -
703. 数据流中的第K大元素
思路1:构造一个小根堆。堆顶为第k大元素。先增加k个元素,长度超过k后,比较每个元素和堆顶元素的大小若num<=heap[0]:忽略若num>heap[0]:则替换,从堆顶重新调整(1)使用库函数:import heapqclass KthLargest(object): def __init__(self, k, nums): self.k = k...原创 2020-02-15 11:28:41 · 101 阅读 · 0 评论 -
215. 数组中的第K个最大元素
思路1:快排考虑先使用快排实现,练习快排。时间复杂度O(N):如果我们把每次分区遍历的元素个数加起来,就是:n+n/2+n/4+n/8+…+1。这是一个等比数列求和,最后的和等于 2n-1。所以,时间复杂度就为 O(n)。因为一次快排可以实现一个数归位,比较index和n-K的大小如果index==n-K就找到了空间复杂度 : O(1)class Solution: def f...原创 2020-02-14 21:11:11 · 87 阅读 · 0 评论 -
112. 路径总和,113. 路径总和 II,437. 路径总和 III
112. 路径总和-是否存在路径和=target思路1:改自113题class Solution: def hasPathSum(self, root: TreeNode, sumv: int) -> bool: ans,path = [],[] def helper(node): if not node: return ...原创 2020-02-14 16:26:43 · 132 阅读 · 0 评论 -
101. 对称二叉树
思路1:递归基本操作:比较两个节点的值是否相等->前提是存在节点->考虑空节点的比较情况->比较的两个节点应该是左右子树节点->当树为空的时候不存在左右子树时间复杂度:O(n)空间复杂度:O(n)class Solution: def isSymmetric(self, root: TreeNode) -> bool: def ...原创 2020-02-13 21:28:25 · 77 阅读 · 0 评论 -
100. 相同的树
思路1:前序递归遍历,边遍历边比较注意考虑空的情况。时间复杂度:O(n)时间复杂度:O(n)class Solution: def isSameTree(self, p: TreeNode, q: TreeNode) -> bool: # 考虑存在空 if not p and not q:return True elif not...原创 2020-02-13 20:24:51 · 64 阅读 · 0 评论 -
109. 有序链表转换二叉搜索树
思路:链表转数组,再递归时间复杂度O(n)空间复杂度O(n)空了优化下,太慢了class Solution: def sortedListToBST(self, head: ListNode) -> TreeNode: # 为了方便找中点作为根,先转为列表存储 nums = [] while head: ...原创 2020-02-13 17:19:49 · 63 阅读 · 0 评论 -
106. 从中序与后序遍历序列构造二叉树
类似 105. 从前序与中序遍历序列构造二叉树class Solution: def buildTree(self, inorder: List[int], postorder: List[int]) -> TreeNode: if len(inorder)==0: return None root = TreeNode(postorder[-1])...原创 2020-02-13 16:37:27 · 75 阅读 · 0 评论 -
105. 从前序与中序遍历序列构造二叉树
思路1:递归递归的代码很容易想到,但是确实比较费时。时间复杂度:O(N),递归栈的深度为N时间复杂度:O(N)class Solution: def buildTree(self, preorder: List[int], inorder: List[int]): if len(preorder)==0:return None root = Tree...原创 2020-02-13 16:25:47 · 74 阅读 · 0 评论 -
98. 验证二叉搜索树、450. 删除二叉搜索树中的节点
class Solution: def isValidBST(self, root: TreeNode) -> bool: # max(left)<root<min(right) def helper(root,low,high): if not root:return True if not...原创 2020-02-13 15:48:25 · 77 阅读 · 0 评论 -
树的前序、中序、后序
前序中序后序层次1.前序非递归:首先压入根节点,栈不空:先弹出操作,然后先压入右节点,最后压入左节点。2.中序3.后序原创 2020-02-13 15:30:06 · 187 阅读 · 0 评论 -
61. 旋转链表
思路:双指针时间复杂度:O(n),遍历时间复杂度:O(1),常数变量这里的关键是确定新的头结点的位置:当k<=length: new_head = length-k-1当k>length: k = k%length => new_head = length-k%length-1class Solution: def rotateRight(self, he...原创 2020-02-13 10:46:14 · 73 阅读 · 0 评论 -
454. 四数相加 II
思路1:哈希表前面的四数相加使用了双指针,但是本题是多个列表,无法使用。考虑使用哈希表,最好的情况是使用两个哈希表,分别存两个数组的和,再检查是否存在。当然,实际上只用一个哈希表就行了。时间复杂度O(n2)class Solution: def fourSumCount(self, A: List[int], B: List[int], C: List[int], D: List[i...原创 2020-02-12 20:11:54 · 80 阅读 · 0 评论 -
18. 四数之和
思路1:在三数之和外加一层循环。时间复杂度:O(n3)class Solution: def fourSum(self, nums: List[int], target: int) -> List[List[int]]: n = len(nums) if n<4:return [] ans = [] nums...原创 2020-02-12 17:33:22 · 85 阅读 · 0 评论