leetcode题解
文章平均质量分 67
Wilson-mz
这个作者很懒,什么都没留下…
展开
-
leetcode高频题 4.Median of Two Sorted Arrays-两个有序数组的中位数
leetcode 4.Median of Two Sorted Arrays-两个有序数组的中位数题目思路合并法复杂度切分法复杂度合并,取中位数代码切分法代码题目题目链接思路合并,取中位数归并排序思想合并至中位数位置切分法转变为在两个有序数组中寻找第k小的数L奇数时,令k=L/2,结果为f(k+1)L偶数时,结果为(f(k) + f(k+1))/2L=len(nums1) + len(nums2)取nums1的前k1,nums2的前k2个,k1+k2=k,判断最后一位的大小原创 2021-10-28 09:31:33 · 119 阅读 · 0 评论 -
leetcode高频题-003.无重复字符的最长子串
3.Longest Substring Without Repeating Characters-无重复字符的最长子串题目思路线性法线性法复杂度线性法代码优化的线性法题目题目链接思路暴力线性法从前到后扫描,如果有重复字符,更新长度优化的线性法慢指针不需要从左到右移动,用哈希表保存目标位置,减少比较次数线性法线性法复杂度时间复杂度快慢指针,最多遍历两次快指针添加到哈希集合,慢指针删除表格尺寸为n∗O(1)+n∗O(1)=O(n)n*\mathcal{O}(1)+原创 2021-10-27 19:20:44 · 88 阅读 · 0 评论 -
253. Meeting Rooms II-贪婪
253. Meeting Rooms II-贪婪题目思路贪婪贪婪适用代码题目题目链接给定一系列会议的开始结束时间: [[s1,e1],[s2,e2],…] (si < ei), 求需要的最小会议室个数。输入: [[0, 30],[5, 10],[15, 20]]输出: 2输入: [[7,10],[2,4]]输出: 1思路贪婪定义在每一步中都采取在当前状态下最好或最优的选择,从而希望导致结果最好或最优的算法优点对一些问题,非常直观有效缺点总是做出在当前看来是最好的选择原创 2021-10-27 09:12:33 · 144 阅读 · 0 评论 -
34. Find First and Last Position of Element in Sorted Array-二分搜索
34. Find First and Last Position of Element in Sorted Array-二分搜索题目思路代码题目题目链接思路根据二分搜索模板,只需要修改一下条件即可判断往哪边搜索判断是否刚好满足条件代码class Solution: def searchRange(self, nums: List[int], target: int) -> List[int]: low = 0 high = len(nums)原创 2021-10-25 20:21:16 · 74 阅读 · 0 评论 -
33.Search in Rotated Sorted Array-旋转排序数组-二分搜索
33.Search in Rotated Sorted Array-旋转排序数组-二分搜索题目思路代码题目题目链接思路根据二分搜索模板,只需要修改一下条件即可判断往哪边搜索判断哪边已经排好序代码class Solution: def search(self, nums: List[int], target: int) -> int: low = 0 high = len(nums) - 1 return self.binary原创 2021-10-25 20:16:58 · 92 阅读 · 0 评论 -
二分搜索模板--Python
二分搜索模板--Python二分法核心点递归写法非递归写法题型1.找确定的边界,如leetcode 34模糊的边界leetcode33旋转排序数组的搜索不定长的边界二分法核心点确定搜索的范围和区间取中间的数判断是否满足条件如果不满足条件,判定应该往哪个半边继续搜索递归写法def binary_search_recursive(nums, target, low, high): """ 在nums的low到high下标的闭区间中搜索target :param nums:原创 2021-10-25 20:08:43 · 114 阅读 · 0 评论 -
动态规划小结/NP/01背包分析
动态规划小结普通的线性规划和区间规划里,一般题目有两种需求:非决定性多项式(NP)时间复杂度01背包普通的线性规划和区间规划里,一般题目有两种需求:统计最优解约束规划对输出结果添加条件–如01背包题目链接非决定性多项式(NP)Non-deterministic Polynomial,不能在多项式时间复杂度内解决时间复杂度程序运行时间随着问题规模扩大的增长有多快非多项式时间复杂度指数级,如O(2n)\mathcal{O}(2^n)O(2n),O(3n)\mathcal{O}(原创 2021-10-25 19:46:12 · 148 阅读 · 0 评论 -
516.Longest Palindromic Subsequence-最长回文子序列-区间规划
516.Longest Palindromic Subsequence-最长回文子序列-区间规划题目思路初始化状态复杂度代码题目题目链接思路动态规划,二维表记录两个下标段间最长的回文子序列长度,然后不断扩大至整个序列当首尾的两个字符相等时,直接将这两个字符加入:dp[0][n−1]=dp[1][n−2]+2dp[0][n-1] = dp[1][n-2] + 2dp[0][n−1]=dp[1][n−2]+2不相等时,二选一:dp[0][n−1]=max(dp[1][n−1],dp[0][n−2原创 2021-10-25 19:27:58 · 114 阅读 · 0 评论 -
Leetcode62. Unique Paths-动态规划/数学公式
Leetcode62. Unique Paths-动态规划Leetcode62. Unique Paths-动态规划题目思路复杂度代码DP-O(m∗n)\mathcal{O}(m*n)O(m∗n)时间,O(m∗n)\mathcal{O}(m*n)O(m∗n)空间DP-O(m∗n)\mathcal{O}(m*n)O(m∗n)时间,O(1)\mathcal{O}(1)O(1)空间数学公式法-O(m+n)\mathcal{O}(m+n)O(m+n)时间,O(1)\mathcal{O}(1)O(1)空间Leetc原创 2021-05-04 17:22:22 · 134 阅读 · 0 评论 -
Leetcode70. Climbing Stairs-斐波那契数列
Leetcode70. Climbing Stairs-斐波那契数列题目思路复杂度斐波那契数列题目题目链接思路见leetcode题解复杂度见leetcode题解斐波那契数列class Solution: def climbStairs(self, n: int) -> int: if n <= 1: return max(n, 0) a = 1 b = 2原创 2021-05-04 16:08:55 · 89 阅读 · 0 评论 -
Leetcode300. Longest Increasing Subsequence-动态规划/二分查找
Leetcode300. Longest Increasing Subsequence-动态规划/二分查找题目思路复杂度动态规划O(n2)O(n^2)O(n2)时间动态规划+二分查找O(nlogn)O(nlogn)O(nlogn)时间DP+二分查找(bisect库)题目题目链接思路见leetcode题解复杂度见leetcode题解动态规划O(n2)O(n^2)O(n2)时间class Solution: def lengthOfLIS(self, nums): if原创 2021-05-03 20:55:11 · 105 阅读 · 0 评论 -
Leetcode52. N-Queens II-回溯
Leetcode52. N-Queens II-回溯题目思路如何回溯回溯要点复杂度代码题目题目链接思路回溯算法在每一行对每个位置进行试放置,如果没有冲突,到下一行继续尝试放置,当产生冲突时回退,当所有行都放置好后就找到一个解如何回溯在下面的代码中,通过solution数组的solution.pop(),回退上一个尝试的状态回溯要点可以看到,回溯算法有两个方面需要注意:什么情况下回退如何回退复杂度T(n)=n∗T(n−1)+O(n2)T(n) = n*T(n-1) + O(n^2原创 2021-05-03 15:58:56 · 94 阅读 · 0 评论 -
Leetcode39. Combination Sum-回溯
Leetcode39. Combination Sum-回溯题目思路如何回退回溯要点复杂度代码题目题目链接思路回溯算法不断对每个候选数字进行尝试,遇到以下情况进行回退:已经可以判断不可能再符合条件的时候正好满足条件,可以得出解的时候如何回退在下面的代码中,通过solution数组的solution.pop(),回退上一个尝试的状态回溯要点可以看到,回溯算法有两个方面需要注意:什么情况下回退如何回退复杂度好像不是很好确定,和具体的candidates和target有很大的原创 2021-05-03 15:18:27 · 119 阅读 · 0 评论 -
Leetcode91. Decode Ways-递归
Leetcode91. Decode Ways-递归题目思路实现差异复杂度从前到后从后到前题目题目链接思路假设字符串长度为N,用递归来缩减问题规模,有两个方向:从前到后每个位置有两种可能解码:takeOne:取前1个字符,则解码方案数与后面N-1个字符的方案数相同takeTwo:取前2个字符,则解码方案数与后面N-2个字符的方案数相同总解码数为takeOne+takeTwo从后到前每个位置有两种可能解码:takeOne:取最后1个字符,则解码方案数与前面N-1个字符的方案数相同原创 2021-05-03 12:38:13 · 127 阅读 · 0 评论 -
Leetcode215. Kth Largest Element in an Array-快速选择算法
Leetcode215. Kth Largest Element in an Array题目代码题目题目链接代码class Solution: # quick select, based on quick sort def findKthLargest(self, nums: List[int], k: int) -> int: return self.quick_select(nums, 0, len(nums) - 1, k) def qu原创 2021-04-28 21:47:42 · 100 阅读 · 0 评论 -
Leetcode16. 3Sum Closest-最接近的三数和(99.88%时间应该是最优解了)
Leetcode16. 3Sum Closest题目思路复杂度代码空间改进题目题目链接思路对数组升序排序,外层从前到后遍历(i),选定nums[i]后,里层循环对i后面的数组求最接近target-nums[i]的两个数,先判断边界情况(选定nums[i]后,在后面的数组里能找到的最大和与最小和),可以省去一部分不必要的判断,再用两个指针在后面数组求和,一个从左到右,一个从右到左,相遇时退出里层循环复杂度时间复杂度O(N2)\mathcal{O}(N^2)O(N2)两层循环空间复杂度原创 2021-04-27 23:14:13 · 115 阅读 · 1 评论 -
Leetcode147. 对链表进行插入排序
Leetcode147. 对链表进行插入排序题目代码题目题目链接代码# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: def insertionSortList(self, head: ListNode) -> ListNode:原创 2021-04-26 21:56:03 · 52 阅读 · 0 评论 -
Leetcode315. 计算右侧小于当前元素的个数-线段树
Leetcode315. 计算右侧小于当前元素的个数-线段树题目思路代码题目题目链接思路为练习一下线段树,找的这道题,自己手写还是费劲,找的代码(忘记在哪了)…代码class SegmentTreeNode: def __init__(self, low, high): self.low = low self.high = high self.left = None self.right = None sel原创 2021-04-24 19:20:54 · 131 阅读 · 0 评论 -
Leetcode322. Coin Change-动态规划
Leetcode322. Coin ChangeLeetcode322. Coin Change题目思路回头看的最佳选择复杂度代码Leetcode322. Coin Change题目题目链接思路将目标数额记为amount,拥有的面值包含在coins中从1到amount,每个数额都至少由一个coin组成,那剩下的是left = amount-coin,left的计算也由同样方式得出如amount=10,coins = [1, 2, 5]:10可以由9+1,8+2,5+5组成,那么在这三个中,取原创 2021-04-10 17:11:38 · 163 阅读 · 0 评论 -
Leetcode300. Longest Increasing Subsequence-动态规划
Leetcode300. Longest Increasing SubsequenceLeetcode300. Longest Increasing Subsequence题目思路复杂度代码Leetcode300. Longest Increasing Subsequence题目题目链接思路在当前位置上,回头看前边比它小的元素的最长序列有多长官方题解有动画演示这是动态规划解法,还可以用二分法继续降低复杂度,同样见官方题解复杂度官方分析时间复杂度O(N2)\mathcal{O}(N^2原创 2021-04-10 16:01:06 · 93 阅读 · 0 评论 -
Leetcode53. Maximum Subarray-动态规划法及累加和方法
Leetcode53. Maximum SubarrayLeetcode53. Maximum Subarray题目思路复杂度代码Leetcode53. Maximum Subarray题目题目链接思路记数组为A(N)\mathcal{A}(N)A(N),DP数组为M(N)\mathcal{M}(N)M(N)动态规划考虑当前位置最佳选择,在这个问题上,位置i有两个选择:i=0,M(0)=A(0)\mathcal{M}(0)=\mathcal{A}(0)M(0)=A(0)i>0,若M(原创 2021-04-10 15:40:26 · 125 阅读 · 0 评论 -
Leetcode337. House Robber III-打家劫舍系列3-动态规划与树的后序遍历
337. House Robber III337. House Robber III题目思路复杂度代码337. House Robber III与Leetcode198. House Robber和213. House Robber II不同,这道题涉及树的遍历题目题目链接思路对树进行后序遍历,完成左右子树的"劫"与"不劫"的最优判断之后,对当前节点判断"劫"与"不劫"就很容易进行了这道题也有官方题解,解释清楚一点,python代码和这里给出的基本一致,只是变量命名,元组拆包不一样而已,看到这原创 2021-04-10 00:03:38 · 115 阅读 · 2 评论 -
Leetcode213. House Robber II-动态规划-打家劫舍系列2
213. House Robber II213. House Robber II题目思路复杂度代码213. House Robber II这道题是对198的简单扩展Leetcode打家劫舍系列的对比可以参考Leetcode198. House Robber题目题目链接思路由于是环状,且相邻房屋不能同时被劫,只要保证第一个房屋和最后一个房屋不会同时被劫即可,将第一个房屋排除,对[1,n]的房屋进行一次Leetcode198. House Robber的操作,将最后一个房屋排除,对[0,n-1]原创 2021-04-09 23:52:09 · 105 阅读 · 0 评论 -
Leetcode198. House Robber-动态规划-打家劫舍系列1
Leetcode198. House RobberLeetcode198. House Robber题目思路复杂度代码O(1)空间复杂度\mathcal{O}(1)空间复杂度O(1)空间复杂度O(n)空间复杂度(常规解法,保留DP数组)\mathcal{O}(n)空间复杂度(常规解法,保留DP数组)O(n)空间复杂度(常规解法,保留DP数组)Leetcode198. House RobberLeetcode打家劫舍系列现在有3道题,主要区别在房屋分布的几何结构不一样,导致遍历时用的方式不同,核心都是动态原创 2021-04-09 23:42:16 · 167 阅读 · 0 评论 -
Leetcode79. Word Search-dfs
Leetcode79. Word SearchLeetcode79. Word Search题目思路复杂度代码Leetcode79. Word Search完成Leetcode212. Word Search II后,简化版的Leetcode79. Word Search改写一下程序就可以完成题目题目链接思路对board中的每个字母,进行dfs遍历,检查是否与word match复杂度设词的长度为L,board有M行N列时间复杂度O(n)\mathcal{O}(n)O(n)最坏情况,原创 2021-04-05 15:46:26 · 96 阅读 · 0 评论 -
Leetcode212. Word Search II-前缀树Trie
Leetcode212. Word Search IILeetcode212. Word Search II题目思路复杂度代码Leetcode212. Word Search II题目题目链接思路将词典构建为Trie,对board中的每个字母,进行dfs遍历,检查是否在Trie中复杂度设词典最长词的长度为L,board有M行N列时间复杂度O(n)\mathcal{O}(n)O(n)最坏情况,board中的每个字母,向四个方向都能不停的匹配下去,直到达到字典中的单词长度,如字典为aaa原创 2021-04-05 14:54:59 · 109 阅读 · 0 评论 -
Leetcode785. Is Graph Bipartite?-二部图检测,递归-迭代-详细注释
Leetcode785. Is Graph Bipartite?Leetcode785. Is Graph Bipartite?题目思路复杂度代码递归DFS遍历借助于栈的DFS遍历-迭代Leetcode785. Is Graph Bipartite?题目题目链接思路能将节点分成两个集合U/VU/VU/V的图,就是二部图,若一个节点既能在UUU,也能在VVV中,那就不是二部图DFS(Depth First Search,深度优先搜索)遍历着色,用两种颜色的画笔,交替地对遇到的节点着上不同颜色,未原创 2021-04-05 13:00:32 · 136 阅读 · 0 评论 -
Leetcode347. Top K Frequent Elements-优先队列
Leetcode347. Top K Frequent ElementsLeetcode347. Top K Frequent Elements题目思路复杂度字典计数优先队列代码字典计数优先队列内置优先队列从无到有实现一个优先队列Leetcode347. Top K Frequent Elements题目题目链接这道题用来练习优先队列(二叉堆结构,Binary Tree)思路1.字典计数,按计数排序2.使用优先队列,优先级就是出现次数复杂度字典计数时间复杂度是O(n)\mathcal{O原创 2021-04-04 16:46:19 · 159 阅读 · 2 评论 -
Leetcode230. Kth Smallest Element in a BST,递归/迭代
Leetcode230. Kth Smallest Element in a BST,二叉搜索树中第K小的元素Leetcode230. Kth Smallest Element in a BST,二叉搜索树中第K小的元素题目树的遍历方案方法1,递归实现中序遍历复杂度分析方法2,迭代实现中序遍历复杂度分析Leetcode230. Kth Smallest Element in a BST,二叉搜索树中第K小的元素题目题目链接这道题有官方题解,就直接翻译过来了感言:递归好写,但复杂度比不上迭代,迭代复原创 2021-04-04 13:18:25 · 154 阅读 · 0 评论 -
Leetcode239. Sliding Window Maximum-双端队列
Leetcode239. Sliding Window MaximumLeetcode239. Sliding Window Maximum题目思路复杂度代码Leetcode239. Sliding Window Maximum题目题目链接思路1.暴力循环,对每个窗口内比较最大值2.使用双端队列,从前到后,将数值压入队列中,将队列中比它小的值都弹出复杂度暴力循环的时间复杂度是O(n∗k)O(n*k)O(n∗k)使用栈:时间复杂度,从前到后遍历一次即完成操作,因此为O(n)O(n)O(n)原创 2021-04-03 20:02:31 · 112 阅读 · 2 评论 -
Leetcode739. Daily Temperature-栈解法
Leetcode739. Daily TemperaturesLeetcode739. Daily Temperatures题目思路复杂度代码Leetcode739. Daily Temperatures题目题目链接思路1.暴力循环,对每个温度都向后搜索,找到第一个比它大的值2.使用栈,从前到后,将温度压入栈中,遇到比它大的温度时弹出,记录大温度的索引,这样既能保证是第一个比它大的,又防止了两重循环复杂度暴力循环的时间复杂度是O(n2)O(n^2)O(n2)使用栈:时间复杂度,从前到后原创 2021-04-03 19:26:10 · 85 阅读 · 0 评论 -
Leetcode25-k个一组翻转链表
Leetcode25-k个一组翻转链表Leetcode25-k个一组翻转链表题目思路复杂度代码Leetcode25-k个一组翻转链表题目题目链接题目要求还是简单易懂的,一图胜千言,看图说话:截图来自Leetcode思路是leetcode24的扩展,24是两个一组翻转,这里扩展为k个一组.与leetcode206一脉相承,206是把整个链表从前到后翻转一遍,这道题是分段翻转,逻辑是一样的,只是多了一些控制条件1.控制k个,一组内的翻转和全链表翻转处理一致,这里用数字控制循环2.组间切换,原创 2021-04-03 18:21:09 · 84 阅读 · 0 评论 -
Leetcode206-reverseList翻转链表
Leetcode206-翻转链表-pythonLeetcode206-翻转链表题目思路复杂度代码Leetcode206-翻转链表还是得多写博客才能让自己保持思考啊,不然都懒下去了题目题目链接题目加上图片,含义显而易见:截图来自Leetcode思路从前到后遍历链表,每次改变一个箭头的指向1.最基本的操作是交换两个节点,这是循环体的主要功能2.要保证能够把所有节点都进行两两交换,就必须保证后面的第三个节点还能被访问到,且能够正常结束,这是循环体的外围保障复杂度时间复杂度,从前到后遍历一原创 2021-04-03 15:47:42 · 87 阅读 · 0 评论