![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode
huahuahuahhhh
一步一步,慢慢来
展开
-
两个链表生成相加链表
两个链表生成相加链表题目思路先将两个链表分别反转从头部开始相加(注意进位及一个链表遍历完的情况)再将相加后的链表反转class ListNode: def __init__(self, x): self.val = x self.next = None## # @param head1 ListNode类 # @param head2 ListNode类 # @return ListNode类#def reverse(p): p原创 2021-06-01 13:09:43 · 94 阅读 · 0 评论 -
最长无重复子数组
题目解法 字典 + 队列遍历数组,新的元素element 不在字典中,将元素同时加入到字典和队列中。字典的key是元素值,value是什么不重要如果已经在列表中,则要弹出这个元素及其前面的所有元素,相应地删除字典中地这些元素,在队列和字典中加入这个元素[1,2,3,2,5]遍历到1,dic={1:0} quee = [1]dic={1:0,2:0} quee = [1,2]dic={1:0,2:0,3:0} quee = [1,2,3]遇到字典中已经有的元素了,弹出队列中的元素了,同时原创 2021-05-29 01:33:59 · 213 阅读 · 0 评论 -
剑指 Offer 34. 二叉树中和为某一值的路径
题目我的方法思路用栈的方法遍历二叉树。每次遍历一个数,将它的值加在temp中,同时判断sum(temp)==target是否成立,再看该节点是否是叶子节点,如果二者都成立,则将temp加入到路径结果中每次遍历完一个节点的子树后,将该节点从栈中弹出的同时,也将节点的值从temp中弹出主要是在前序遍历的基础上改的。不能用简易版的前序遍历,根节点比右孩子提前弹出,导致路径不完整,结果不正确。temp成立时,不能直接用result.append(temp),后面temp改动,result也会跟着原创 2021-04-28 17:47:57 · 104 阅读 · 0 评论 -
剑指 Offer 29. 顺时针打印矩阵
题目剑指offer的解题思路顺时针打印矩阵,可以分解为每次打印一个数,顺序是从左到右,从上到下,然后从右到左,从下到上。打印每一圈的起点(startX,startY)分别为(0,0),(1,1)… 起点的横坐标与纵坐标相同,没打印完一圈后+1. 打印的退出条件是startX2>=columns 或 startX2>=rows.不是每一打印都能打印完整的一圈的。情况如下:class Solution: def spiralOrder(self, matrix):原创 2021-04-28 17:19:14 · 114 阅读 · 0 评论 -
剑指 Offer 26. 树的子结构
题目题目给出,空树不是任意数的子结构。递归的时候这是一个出口条件。大致思路:前序遍历树A,判断以当前遍历的节点形成的子树是否包含树B判断A左子树是否包含树B判断A右子树是否包含树Brecur判断A树以当前节点为根节点的树是否包含树Bclass Solution: def isSubStructure(self, A: TreeNode, B: TreeNode) -> bool: def recur(A,B): if not B:原创 2021-04-27 15:51:58 · 87 阅读 · 0 评论 -
剑指 Offer 24. 反转链表
题目我的解法遍历链表时,通过栈,存取每个节点。遍历完后,将栈中的节点一次弹出# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: def reverseList(self, head: ListNode) -> ListNode:原创 2021-04-26 16:34:29 · 95 阅读 · 0 评论 -
898. 子数组按位或操作
题目题解本题是按动态规划来解的cur :集合。保存的是当前遍历的元素与上一轮cur或的结果+ 当前的元素的集合ans: 集合。目前所有元素或的结果整理的就是所有元素的排列组合class Solution(object): def subarrayBitwiseORs(self, A): ans = set() cur = {0}# 含一个元素的是集合,不含元素的是空字典 # print(type(cur)) for x原创 2021-04-25 18:43:39 · 120 阅读 · 0 评论 -
?判断子序列
题目1. 双指针法两个指针同时向后移动,移到最后,如果子序列没有遍历完,则返回False,否则,返回Trueclass Solution: def isSubsequence(self, s: str, t: str) -> bool: n, m = len(s), len(t) i = j = 0 while i < n and j < m: if s[i] == t[j]:原创 2021-04-23 20:34:10 · 93 阅读 · 0 评论 -
连续子数组的最大和
题目方法一通过连个变量分别记录遍历到当前元素的最大值及整个数组的最大值数组可能为全是负数,最小的元素在数组中间我的解法class Solution: def maxSubArray(self, nums) -> int: temp_sum = 0 max_sum = nums[0] for i in nums: if temp_sum + i > 0: temp_sum原创 2021-04-23 19:05:39 · 107 阅读 · 0 评论 -
783. 二叉搜索树节点最小距离
题目方法一 转数组题目给出的数据是放在二叉搜索树中。二叉搜索树的中序遍历的结果是从小到大排列的。用中序遍历二叉搜索树,得到拍好序的数组比较排序好的素组两两间的差值class Solution: def minDiffInBST(self, root: TreeNode) -> int: def in_order(root): if not root: return stack = [原创 2021-04-22 18:49:58 · 108 阅读 · 0 评论 -
563. 二叉树的坡度
题目我的想法从根节点开始,求出每个几点的度,然后累加。代码如下:# Definition for a binary tree node.class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = rightdef node_Tilt(root):# 每个节点的坡度 if n原创 2021-04-22 16:03:06 · 137 阅读 · 1 评论 -
404. 左叶子之和
题目404. 左叶子之和找到左叶子方法一:递归判断根节点是否有左子树,用sum_left记录递归左子树与右子树,找出其中的叶子节点# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):# self.val = val# self.left = left# self.righ原创 2021-04-21 17:17:57 · 157 阅读 · 2 评论 -
606. 根据二叉树创建字符串
分析题目说这个是树的前序遍历。不仅仅是输出数字,还要输出括号。有4种情况:左右子树都为空。输出root左子树不空,右子树空。输出root(left)左子树不空,右子树空。左子树的部分用空括号代替。输出root()(right).左右子树都不为空。输出root(left)(right)方法一 栈入栈的时候,(和val同时加到结果列表在访问右子树时,判断当前节点的左子树是否为空,决定加不加()当前节点的左右子树都访问完后,从栈中弹出,此时加右括号)最后去掉最外层的括号clas..原创 2021-04-21 15:40:23 · 103 阅读 · 0 评论 -
110. 平衡二叉树
题目地址https://leetcode-cn.com/problems/balanced-binary-tree/讲解地址https://leetcode-cn.com/problems/balanced-binary-tree/solution/ping-heng-er-cha-shu-by-leetcode-solution/# 方法1,求每个节点的高度差# Definition for a binary tree node.class TreeNode: def __init__(.原创 2021-04-21 09:52:25 · 142 阅读 · 0 评论 -
572. 另一个树的子树
t是s的子树有三种情况:t 和 s相等(t和s的根值相等,t的左子树与s的左子树相等且t的右子树与s的右子树相等)t 在s 的左子树里面t在s 的右子树里面class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = rightdef is_same(s,t):# 判断两个树是否.原创 2021-04-20 15:50:09 · 107 阅读 · 0 评论 -
镜像二叉树
左子树和右子树的根节点的值相等;递归地,左子树的左子树与右子树的右子树对称,左子树的右子树与右子树的左子树对称。class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = rightdef check2(left_p,right_p): if (not left_p and .原创 2021-04-20 15:31:42 · 99 阅读 · 0 评论 -
102 二叉树层序遍历
层序遍历,每次层的输出是是一个一维数组,整个二叉树的输出结果是二维数组BFS遍历,依托于队列结构,每次在根节点出栈的时候,将其值加在结果列表中,然后将他的左右孩子节点入队列。层序遍历相对于BFS,需要知道每一层有多少个节点。因此,我们需要稍微修改一下代码,在每一层遍历开始前,先记录队列中的结点数量 nn(也就是这一层的结点数量),然后一口气处理完这一层的 n 个结点。class Solution: def levelOrder(self, root: TreeNode): .原创 2021-04-19 16:31:15 · 354 阅读 · 0 评论 -
剑指 Offer 52. 两个链表的第一个公共节点
原始想法是双重循环遍历两个链表,比较两个链表的当前值是否相同。这样存在一个问题,链表中的元素有重复,比如上例,可以返回相同的元素是4.嗐,黔驴技穷,翻看大神的题解同时遍历两个链表,指针A遍历完headA后遍历headB,指针B遍历完headB后遍历headA,二者相遇时,是遇到的首个公共节点。此时,二者分别遍历了a+b-c个元素。class Solution: def getIntersectionNode(self, headA: ListNode, headB: ListNode) -.原创 2021-04-15 10:00:45 · 78 阅读 · 0 评论 -
剑指 Offer 53 - I. 在排序数组中查找数字 I
剑指 Offer 53 - I. 在排序数组中查找数字 I统计一个数字在排序数组中出现的次数。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: 2示例 2:输入: nums = [5,7,7,8,8,10], target = 6输出: 0我的解法:已知数组是按从小到大排序好的。找出数列中与target相等的数的索引值mid,然后以mid为基准向左向右遍历,统计等于target的元素的个数class Solution: def searc原创 2021-04-13 12:03:48 · 85 阅读 · 0 评论 -
735. 行星碰撞
735. 行星碰撞给定一个整数数组 asteroids,表示在同一行的行星。对于数组中的每一个元素,其绝对值表示行星的大小,正负表示行星的移动方向(正表示向右移动,负表示向左移动)。每一颗行星以相同的速度移动。找出碰撞后剩下的所有行星。碰撞规则:两个行星相互碰撞,较小的行星会爆炸。如果两颗行星大小相同,则两颗行星都会爆炸。两颗移动方向相同的行星,永远不会发生碰撞。示例 1:输入:asteroids = [5,10,-5] 输出:[5,10] 解释:10 和 -5 碰撞后只剩下 10 。 5 和原创 2021-03-31 16:47:47 · 213 阅读 · 0 评论 -
剑指 Offer 22. 链表中倒数第k个节点
我的解法:很直接先遍历一次链表,得到链表的长度。新建变量指向头部,不能动head指针返回n-k的位置参考解法3. 定义两个指针former,latter分别指向链表的头部4. former指针向后移动k步5. fomer 和 latter 同时向后移动,当former移到尾部时,返回latter,即为倒数第K个节点示例:数组:[1, 2, 3, 4, 5, 6, 7], k=26. 定义两个指针former,latter分别指向链表的头部7. former 向后移动k步,指向3..原创 2020-12-10 14:34:35 · 121 阅读 · 1 评论 -
394. 字符串解码
394. 字符串解码题目我的解答题目给定一个经过编码的字符串,返回它解码后的字符串。编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。示例 1:输入:s = “3[a]2[bc]”输出:“aaa原创 2020-08-22 20:45:00 · 201 阅读 · 0 评论 -
1209. 删除字符串中的所有相邻重复项 II
1209. 删除字符串中的所有相邻重复项 II题目我的解答题目给你一个字符串 s,「k 倍重复项删除操作」将会从 s 中选择 k 个相邻且相等的字母,并删除它们,使被删去的字符串的左侧和右侧连在一起。你需要对 s 重复进行无限次这样的删除操作,直到无法继续为止。在执行完所有删除操作后,返回最终得到的字符串。本题答案保证唯一。示例 1:输入:s = “abcd”, k = 2输出:“abcd”解释:没有要删除的内容。示例 2:输入:s = “deeedbbcccbdaa”, k = 3原创 2020-08-20 11:43:35 · 260 阅读 · 0 评论 -
1249. 移除无效的括号
1249. 移除无效的括号题目解法题目移除无效的括号给你一个由 ‘(’、’)’ 和小写字母组成的字符串 s。你需要从字符串中删除最少数目的 ‘(’ 或者 ‘)’ (可以删除任意位置的括号),使得剩下的「括号字符串」有效。请返回任意一个合法字符串。有效「括号字符串」应当符合以下 任意一条 要求:空字符串或只包含小写字母的字符串可以被写作 AB(A 连接 B)的字符串,其中 A 和 B 都是有效「括号字符串」可以被写作 (A) 的字符串,其中 A 是一个有效的「括号字符串」(C)变成©,原创 2020-08-11 22:29:09 · 238 阅读 · 0 评论 -
856. 括号的分数
856. 括号的分数题目我的解答大神解答题目括号的分数给定一个平衡括号字符串 S,按下述规则计算该字符串的分数:() 得 1 分。AB 得 A + B 分,其中 A 和 B 是平衡括号字符串。(A) 得 2 * A 分,其中 A 是平衡括号字符串。示例 1:输入: “()”输出: 1示例 2:输入: “(())”输出: 2示例 3:输入: “()()”输出: 2示例 4:输入: “(()(()))”输出: 6提示:S 是平衡括号字符串,且只含有 ( 和 ) 。2原创 2020-08-01 10:59:36 · 179 阅读 · 0 评论 -
503. 下一个更大元素 II
503. 下一个更大元素 II题目我的解答分析解答官方解法题目给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。示例 1:输入: [1,2,1]输出: [2,-1,2]解释: 第一个 1 的下一个更大的数是 2;数字 2 找不到下一个更大的数;第二个 1 的下一个最大的数需要循环搜索,结果也是 2。原创 2020-07-29 15:56:18 · 180 阅读 · 0 评论 -
20. 有效的括号
20. 有效的括号题目我的解答大神解答题目给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例 1:输入: “()”输出: true示例 2:输入: “()[]{}”输出: true示例 3:输入: “(]”输出: false示例 4:输入: “([)]”输出: false示例 5:输入: “{[]}”输出:原创 2020-07-29 09:51:36 · 132 阅读 · 0 评论 -
155. 最小栈
题目我的解答大神解答155. 最小栈设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。push(x) —— 将元素 x 推入栈中。pop() —— 删除栈顶的元素。top() —— 获取栈顶元素。getMin() —— 检索栈中的最小元素。示例:输入:[“MinStack”,“push”,“push”,“push”,“getMin”,“pop”,“top”,“getMin”][[],[-2],[0],[-3],[],[],[],[]]输出:[nul原创 2020-07-28 16:44:48 · 116 阅读 · 0 评论 -
删除最外层的括号
删除最外层的括号有效括号字符串为空 ("")、"(" + A + “)” 或 A + B,其中 A 和 B 都是有效的括号字符串,+ 代表字符串的连接。例如,"","()","(())()" 和 “(()(()))” 都是有效的括号字符串。如果有效字符串 S 非空,且不存在将其拆分为 S = A+B 的方法,我们称其为原语(primitive),其中 A 和 B 都是非空有效括号字符串。给出一个非空有效字符串 S,考虑将其进行原语化分解,使得:S = P_1 + P_2 + … + P_k,其中 .原创 2020-07-28 15:30:41 · 539 阅读 · 0 评论 -
496. 下一个更大元素 I
496. 下一个更大元素 I题目分析我的解答官方解答题目给定两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。找到 nums1 中每个元素在 nums2 中的下一个比其大的值。nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1 。示例 1:输入: nums1 = [4,1,2], nums2 = [1,3,4,2].输出: [-1,3,-1]解释:对于num原创 2020-07-24 22:13:28 · 105 阅读 · 0 评论 -
1047. 删除字符串中的所有相邻重复项
删除字符串中的所有相邻重复项题目分析我的解答题目删除字符串中的所有相邻重复项给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在 S 上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。示例:输入:“abbaca”输出:“ca”解释:例如,在 “abbaca” 中,我们可以删除 “bb” 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 “aaca”,其中又只有 “aa原创 2020-07-23 21:19:29 · 151 阅读 · 0 评论 -
剑指 Offer 09. 用两个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )示例 1:输入:[“CQueue”,“appendTail”,“deleteHead”,“deleteHead”][[],[3],[],[]]输出:[null,null,3,-1]示例 2:输入:[“CQueue”,“deleteHead”,“appendTail”,“ap原创 2020-07-22 21:36:34 · 112 阅读 · 1 评论 -
3. 无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。来源:力扣(Le原创 2020-07-20 13:32:46 · 176 阅读 · 0 评论 -
leetcode与python进阶学习总结
leetcode与python进阶学习总结l1是一个链表型,val是其属性,以下句子意义为如果l1不为空则取l1.val否则取0,节省代码空间,干净利落x= l1.val if l1 else 0三目运算符 条件为真时的结果 if 条件 else 条件为假时的结果x = x if (x>y) else y # 取x,y中较大的数并赋给x被惊艳到了:判断是否为回文。不知道如何表达,虽然算法的时间空间复杂度差不多,但是这个太简美了def isPalindrome(sel转载 2020-07-16 10:21:56 · 303 阅读 · 0 评论 -
2. 两数相加(中等)
2. 两数相加(中等)给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807来源:力扣(LeetCode)链接:http原创 2020-07-16 10:15:48 · 186 阅读 · 0 评论 -
120. 三角形最小路径和
给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。例如,给定三角形:[[2],[3,4],[6,5,7],[4,1,8,3]]自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。说明:如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分。来源:力扣(LeetCode)链接:https:原创 2020-07-15 00:49:29 · 198 阅读 · 0 评论