leetcode
开拓算法
这个作者很懒,什么都没留下…
展开
-
【leetcode】11 盛最多水的容器
题目分析双指针指向容器的两边,计算当前容积。因为容积的计算是高度较低的一边和底的长度决定的,所以移动低的边让容器有更大容积的可能。代码class Solution(object): def maxArea(self, height): """ :type height: List[int] :rtype: int """ l,r = 0,len(height)-1 maxarea = 0原创 2021-01-17 18:58:45 · 97 阅读 · 0 评论 -
【leetcode】25 K 个一组翻转链表
题目分析p.next指向翻转子链表的头q指向翻转链表的尾的next把p和q之间的链表翻转得到新的链表L把p.next指向L的头L.next指向qp指向L的尾,然后q向后走k-1步,再次翻转p,q之间的链表python代码class Solution(object): def reverseKGroup(self, head, k): """ :type head: ListNode :type k: int :rty原创 2020-12-17 23:16:21 · 109 阅读 · 0 评论 -
【leetcode】99 恢复二叉树搜索树
题目分析二叉搜索树的中序遍历就是递增序列,所以我们只要找到被替换树的中序过程中违反递增规律的节点就可以了。替换后 有两种情况:1,[1,3,2,4]2, [4,2,3,1]第一种情况 替换3和2的值。第二种情况 替换4和1的值。在中序遍历树的过程中,只要我们发现逆序数对并且用两个值x,y记录逆序数对的两个值。在第一种情况下 x,y被同时赋值。在第二种情况下,先记录x=4,后记录y=1。最后替换x,y的值,完成恢复。python代码class Solution(object):原创 2020-12-17 00:19:54 · 149 阅读 · 1 评论 -
【leetcode】二叉树中的最大路径和
题目分析求当前节点T包含的最大路径,那么就是 以左节点L开始的最大路径和Lmax,和以右节点开始的最大路径和Rmax,这三个部分构成的最大路径和有(T,T+Lmax,T+Rmax,T+Rmax+Lmax) 这四种情况和当前最大路径和MAX做对比。当求以左节点为开始的最大路径时,左节点必须包含在路径内,并且左节点的左右子树必须选择其中一个或者都不选择,也就是说(L,L+L.Lmax,L+L.Rmax)这三种路径返回最大的给T。python代码class Solution(object):原创 2020-12-16 22:23:25 · 117 阅读 · 0 评论 -
【leetcode】236 二叉树的最近公共祖先
题目分析因为树中的节点值都是唯一的,所以判断一个点是否是公共祖先有两种方法:1,左右子树都包含一个数,那么这个节点是公共祖先。2,左右子树只有一个包含目标值,当前节点等于另一个目标值。根据这个条件可以筛选出最近的公共祖先。假设这个点不是最近的,那么该节点的父节点也满足这两个条件,则值就不是唯一的,所以这个点就是最近祖先。python代码lass Solution(object): def __init__(self): self.res = None def原创 2020-12-16 21:57:04 · 92 阅读 · 0 评论 -
【leetcode】437 路径总和III
题目分析每个节点都有可能是路径的开始,所以每次先算以当前节点T为开始的符合条件的路径有几条。然后分别算以左右节点为开始的路径有几条。最后返回T的路径条数+左子树的路径条数+右子树的路径条数。每次算路径和是否等于target时,用sum减去当前节点的数值,如果为0,则当前节点正好是一个路径的尾节点,当前存在1条,如果不为0,那么算左右子树有没有符合sum-当前节点数值的和的路径。python代码class Solution(object): def pathSum(self, root,原创 2020-12-16 00:03:44 · 267 阅读 · 0 评论 -
【leetcode】98 验证二叉搜索树
题目分析递归,每次为节点设置上下边界。python代码class Solution(object): def isValidBST(self, root): """ :type root: TreeNode :rtype: bool """ return self.helper(root,float("-inf"),float("inf")) def helper(self,root,low原创 2020-12-12 21:00:57 · 59 阅读 · 0 评论 -
【leetcode】53 最大子序和
题目分析设dp[i]是到i下标的最大子序和。dp[i+1]就根据dp[i]和nums[i+1]算出的值。如果dp[i]小于0,则dp[i+1]等于nums[i+1],否则dp[i+1]等于nums[i+1]。最后的最大值就是dp里的最大值。python代码class Solution(object): def maxSubArray(self, nums): """ :type nums: List[int] :rtype: int原创 2020-12-12 19:11:19 · 61 阅读 · 0 评论 -
【leetcode】145 二叉树的后序遍历
题目分析后序遍历的顺序是 左->右->根。所以有左节点优先遍历左子树,没有左节点再遍历右子树。每次出栈一个节点,如果这个节点是左子树,那么把右子树入栈。如果是右子树,那么就弹出栈顶根节点,或者结束遍历。python代码class Solution(object): def postorderTraversal(self, root): """ :type root: TreeNode :rtype: List[int]原创 2020-12-10 23:08:38 · 83 阅读 · 0 评论 -
【leetcode】94 二叉树的中序遍历
题目分析中序遍历是 左->根->右的方式,有左子树就一路向左入栈,每次从栈弹出一个节点t,先把这个节点当做左节点打印出来,然后如果t有右节点就先入栈。python代码class Solution(object): def inorderTraversal(self, root): """ :type root: TreeNode :rtype: List[int] """ stack = []原创 2020-12-10 00:07:33 · 90 阅读 · 0 评论 -
【leetcode】239 滑动窗口最大值
题目分析维护一个递减的队列,当前数插入时,必须把队尾中小于当前数的数值剔除,再加入当前数到队尾。队头就是最大的值,如果队头的下标已经超出滑动窗口边界,则去掉队头。python代码class Solution(object): def maxSlidingWindow(self, nums, k): """ :type nums: List[int] :type k: int :rtype: List[int]原创 2020-12-09 23:43:08 · 87 阅读 · 0 评论 -
【leetcode】42 接雨水
题目分析当前的接雨水的数量 等于 min(左边最高的柱子,右边最高的柱子)。python代码class Solution(object): def trap(self, height): """ :type height: List[int] :rtype: int """ if not height: return 0 l =0 r = len(height)-1原创 2020-12-09 22:57:22 · 82 阅读 · 0 评论 -
【leetcode】72 编辑距离
题目分析经典的dp题。当word[i]==word[j]时,沿用没有i,j两个字符时的最小编辑距离。当word[i]!=word[j]时,从插入dp[i-1][j]+1,替换dp[i-1][j-1]+1,删除dp[i][j-1]+1中选择一个最小距离。python代码class Solution(object): def minDistance(self, word1, word2): """ :type word1: str :type原创 2020-12-06 23:11:14 · 59 阅读 · 0 评论 -
【leetcode】214 最短回文串
题目分析看到这道题,一开始想用寻找0开头的最长回文子串的方式做。但是在最后一个case的时候超时了。那么换一种思路来看。在kmp中next数组构成存储在i位置的最长公共前后缀的长度。我们把 acbb 翻转成bbca。acbb的前缀和bbca的后缀的最大公共长度的串是“a”。next[-1]表示当遍历完bbca时的最大公共前后缀的长度L,正式我们需要的值。返回时把acbb L后面的串翻转之后放在前面就可以了。python代码class Solution(object): def s原创 2020-12-06 22:23:20 · 109 阅读 · 0 评论 -
【leetcode】44通配符匹配
题目分析当s[i-1]==p[j-1]时或者p[j-1]=="?“时,dp[i][j] =dp[i-1][j-1]当p[j-1]==”*“时,(1)如果不使用*号,则dp[i][j] = dp[i][j-1](2)如果使用*号,则dp[i][j]=dp[i-1][j]python代码class Solution(object): def isMatch(self, s, p): """ :type s: str :type p: str原创 2020-12-05 23:10:58 · 87 阅读 · 0 评论 -
【leetcode】30 串联所有单词的子串
题目分析使用字典+滑动窗口每次选择 words长度的窗口,判断窗口内是否正好包含words所有单词。如果是,记下窗口左指针的位置,否则整体窗口向右移动一位。python代码import copyclass Solution(object): def findSubstring(self, s, words): """ :type s: str :type words: List[str] :rtype: List[int]原创 2020-12-04 21:38:56 · 86 阅读 · 0 评论 -
【leetcode】32 最长有效括号
题目分析本来打算用dp[i][j]来做,但是发现根本没法实现矩阵内的转移方程。后来看了解法发现只用dp[i]来做就可以。任何一个单独的字符都不构成一对括号,所以初始化值为0。当s[i]=="(“时,dp[i]=0当s[i]==”)“时,如果s[i-1]==”(“时,dp[i] = dp[i-2]+2----------------- 否则如果s[i-dp[i-1]-1]==”(",dp[i] = dp[i-1]+2+dp[i-dp[i-1]-2]最原创 2020-12-03 23:53:17 · 100 阅读 · 0 评论 -
【leetcode】20.有效的括号
题目分析通过栈来做,当前字符为左括号,则入栈。当前符号为右括号并且栈顶正好是对应的左括号,则出栈。如果不是对应的左括号返回false。最后遍历完字符串,栈不为空,返回false,否则返回truePython代码class Solution(object): def isValid(self, s): """ :type s: str :rtype: bool """ stack = [] fo原创 2020-12-03 22:32:44 · 46 阅读 · 0 评论 -
【leetcode】14 最长公共前缀
题目分析可以使用归并的思想来做,每两个串left 和right合并出最长公共前缀res,然后res之间再合并。python代码class Solution(object): def longestCommonPrefix(self, strs): """ :type strs: List[str] :rtype: str """ if not strs: return "" return se原创 2020-12-03 22:24:55 · 57 阅读 · 0 评论 -
【leetcode】5 最长回文子串
题目分析以baacac为例,构造dp[j][i],表示从j到i子串是否为回文序列。因为i==j时是单个字符,一定是回文串,所以dp[j][i]的对角线一定是True。当s[j]!=s[i]时,当前子串s[j:i]一定不是回文串。比如s[0:3]当s[j]==s[i]时,如果s[j:i]长度为2,一定是回文串比如s[1:2]当s[j]==s[i]且子串长度大于2,则依据s[j+1:i-1]判断s[j:i]是不是回文串。比如s[3:5]或者s[2:4]。012345T原创 2020-12-02 23:49:58 · 47 阅读 · 0 评论 -
【leetcode】3 无重复字符的最长子串
题目分析首先注意到是最长子串 而不是最长子序列。可以使用滑动窗口,i和j分别指向窗口的两端。使用 一个字典去记录窗口内的值。如果当前的字符是已经出现过的,那么左边界必须往右移,移动到刚刚没过当前字符的位置。如果当前字符没有出现过,那么移动右边界把这个字符划分到窗口内。每次窗口变化,和最大窗口长度进行比较,并把最大值赋值给最大窗口长度。python代码class Solution(object): def lengthOfLongestSubstring(self, s):原创 2020-12-02 22:32:27 · 67 阅读 · 0 评论 -
【leetcode】1143 最长公共子序列
题目分析看到两个字符串就想到用动态规划来做这道题了。设dp[i][j]为text1[:i]和text2[:j]的最长公共子序列的长度。如果计算dp[i][j]分为两种情况:1,当text1[i-1]==text2[j-1]时,此时两个字符串的对应字符相同,所以长度在原来都没这两个字符的基础上+1:dp[i][j]=dp[i-1][j-1]+12, 当text1[i-1]!=text2[j-1]时,此时两个字符串对应的字符不同,那么延续dp[i][j-1]和dp[i-1][j]的最大值。py原创 2020-11-30 22:42:14 · 106 阅读 · 2 评论