
LeetCode
TonyBringwater
贵站狗管理
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
力扣96. 不同的二叉搜索树(动态规划&&数学推导)
96. 不同的二叉搜索树给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?示例:输入: 3输出: 5解释:给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1原创 2020-07-11 16:48:40 · 260 阅读 · 0 评论 -
剑指 Offer 59 - I. 滑动窗口的最大值(暴力循环 / 单调双端队列)
剑指 Offer 59 - I. 滑动窗口的最大值给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。示例:输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值--------------- -----[1 3 -1] -3 5 3 6 7 3 1 [3 -1 -3] 5 3 6原创 2020-07-06 23:18:42 · 300 阅读 · 0 评论 -
剑指 Offer 36. 二叉搜索树与双向链表(DFS&&头指针)
剑指 Offer 36. 二叉搜索树与双向链表输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。为了让您更好地理解问题,以下面的二叉搜索树为例: 4 / \ 2 5 / \ 1 3我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。下图展示了上面的二叉搜索树转化成的链表。“head原创 2020-07-05 18:53:50 · 184 阅读 · 0 评论 -
剑指 Offer 33. 二叉搜索树的后序遍历序列
剑指 Offer 33. 二叉搜索树的后序遍历序列输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。参考以下这颗二叉搜索树: 5 / \ 2 6 / \ 1 3示例 1:输入: [1,6,3,2,5]输出: false示例 2:输入: [1,3,2,6,5]输出: true提示:数组长度 <= 1000分析二叉搜原创 2020-07-05 11:39:26 · 190 阅读 · 0 评论 -
剑指 Offer 65. 不用加减乘除做加法(位运算)
剑指 Offer 65. 不用加减乘除做加法写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。示例:输入: a = 1, b = 1输出: 2提示:a, b 均可能是负数或 0结果不会溢出 32 位整数分析联想一下二进制加法,只要两位同为1,就需要进位,如果不考虑进位,这个位置就是变成了0,显然和异或类似。所以两个数字的异或,就是不计算进位的加法。然后考虑进位,只有两个都是1的才需要进位,所以想到了与运算,两个位置原创 2020-07-05 10:27:57 · 217 阅读 · 0 评论 -
力扣148. 排序链表(归并排序)
力扣148. 排序链表在 O(nlogn) 时间复杂度和常数级空间复杂度下,对链表进行排序。示例 1:输入: 4->2->1->3输出: 1->2->3->4示例 2:输入: -1->5->3->4->0输出: -1->0->3->4->5分析题目要求时间复杂度是O(nlogn),就需要二分,既然是二分,就确定了归并排序。空间复杂度要求O(1),就不能使用递归,并且不能创建额外的空间来保存临时数组。原创 2020-07-01 23:00:25 · 702 阅读 · 0 评论 -
力扣718. 最长重复子数组(暴力循环 / 动态规划)
力扣718. 最长重复子数组给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。示例 1:输入:A: [1,2,3,2,1]B: [3,2,1,4,7]输出: 3解释: 长度最长的公共子数组是 [3, 2, 1]。说明:1 <= len(A), len(B) <= 10000 <= A[i], B[i] < 100分析注意: 子数组是连续的,子序列可以不连续。暴力法对于a中的每个数字,原创 2020-07-01 09:53:53 · 509 阅读 · 0 评论 -
剑指 Offer 47. 礼物的最大价值(动态规划 / DFS)
剑指 Offer 47. 礼物的最大价值在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?示例 1:输入: [ [1,3,1], [1,5,1], [4,2,1]]输出: 12解释: 路径 1→3→5→2→1 可以拿到最多价值的礼物提示:0 < grid.length <原创 2020-06-28 10:28:52 · 450 阅读 · 0 评论 -
剑指 Offer 42. 连续子数组的最大和(动态规划)
剑指 Offer 42. 连续子数组的最大和输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。示例1:输入: nums = [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。提示:1 <= arr.length <= 10^5-100 <= arr[i] <= 100注意原创 2020-06-27 17:23:00 · 591 阅读 · 2 评论 -
剑指 Offer 30. 包含min函数的栈(辅助栈&&对象的相等判断)
剑指 Offer 30. 包含min函数的栈定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。示例:MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.min(); --> 返回 -3.minStack.pop();minStack.top()原创 2020-06-27 09:23:09 · 171 阅读 · 0 评论 -
剑指 Offer 27. 二叉树的镜像(递归)
剑指 Offer 27. 二叉树的镜像请完成一个函数,输入一个二叉树,该函数输出它的镜像。例如输入: 4 / \ 2 7 / \ / \1 3 6 9镜像输出: 4 / \ 7 2 / \ / \9 6 3 1示例 1:输入:root = [4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]限制:0 <= 节点个数 <= 1000分析镜像二叉树,需要递归地将每个原创 2020-06-27 08:45:55 · 328 阅读 · 0 评论 -
剑指 Offer 12. 矩阵中的路径(回溯&&DFS)
剑指 Offer 12. 矩阵中的路径请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。[[“a”,“b”,“c”,“e”],[“s”,“f”,“c”,“s”],[“a”,“d”,“e”,“e”]]但矩阵中不包含字符串“abfb”的路径,因为字符原创 2020-06-26 19:25:53 · 152 阅读 · 0 评论 -
剑指 Offer 07. 重建二叉树(递归&&二叉树遍历的性质)
剑指 Offer 07. 重建二叉树输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如,给出前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树: 3 / \ 9 20 / \ 15 7限制:0 <= 节点个数 <= 5000分析先序遍历是先根,再左,再右,中序遍历是先左,再中,再右。先序根原创 2020-06-26 19:14:37 · 143 阅读 · 0 评论 -
力扣295. 数据流的中位数(排序/大顶堆+小顶堆求中位数)
力扣295. 数据流的中位数中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。例如,[2,3,4] 的中位数是 3[2,3] 的中位数是 (2 + 3) / 2 = 2.5设计一个支持以下两种操作的数据结构:void addNum(int num) - 从数据流中添加一个整数到数据结构中。double findMedian() - 返回目前所有元素的中位数。示例:addNum(1)addNum(2)findMedian() -> 1.5addNum原创 2020-06-23 20:51:28 · 500 阅读 · 0 评论 -
面试题 16.18. 模式匹配(解方程)
力扣面试题 16.18. 模式匹配分析主方法里就是遍历数字解方程,x*countA+y*countB = valueLen找到可行解后就可以根据解来判断是否能匹配。当然,在解方程之前先把特殊情况解决掉,比如字符串为空、a或者b代表空字符串的情况。排除掉这几种特殊情况后,解方程里a和b的数量肯定是都超过1了。思路全在注释里了。代码class Solution { public boolean patternMatching(String pattern, String value) {原创 2020-06-22 10:42:37 · 562 阅读 · 0 评论 -
力扣3. 无重复字符的最长子串(滑动窗口+双指针)
3. 无重复字符的最长子串题目给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: "pwwkew"输出: 3解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。请注意,你的答案必须是 子串 的长度,"pwke" 是原创 2020-06-21 23:20:57 · 323 阅读 · 0 评论 -
力扣5. 最长回文子串(标准动态规划)
力扣5. 最长回文子串给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1:输入: "babad"输出: "bab"注意: "aba" 也是一个有效答案。示例 2:输入: "cbbd"输出: "bb"分析1. 暴力法。时间复杂度O(n³),超时。2. 动态规划。既然是回文字符串,那么如果内层的字母是回文的,并且外层的也是回文,整个字符串就是回文字符串。我们就得到了这么一个关系:从短到长,第i个字母到第j个字母的状态dp[i][j原创 2020-06-21 18:07:35 · 235 阅读 · 0 评论 -
力扣124. 二叉树中的最大路径和(递归+类似DP)
力扣124. 二叉树中的最大路径和给定一个非空二叉树,返回其最大路径和。本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。示例 1:输入: [1,2,3] 1 / \ 2 3输出: 6示例 2:输入: [-10,9,20,null,null,15,7] -10 / \ 9 20 / \ 15 7输出: 42分析这道题应该从叶子节点往上看,既然原创 2020-06-21 17:50:41 · 268 阅读 · 0 评论 -
力扣 572 另一个树的子树(双递归)
#572 另一个树的子树给定两个非空二叉树 s和 t,检验 s中是否包含和t具有相同结构和节点值的子树。s的一个子树包括 s的一个节点和这个节点的所有子孙。s也可以看做它自身的一棵子树。示例 1:给定的树 s: 3 / \ 4 5 / \ 1 2给定的树 t: 4 / \ 1 2返回 true,因为 t 与 s 的一个子树拥有相...原创 2020-05-07 10:38:05 · 221 阅读 · 0 评论 -
力扣 98 验证二叉搜索树(树的递归中序遍历)
#98. 验证二叉搜索树给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例 1:输入: 2 / \ 1 3输出: true示例 2:输入: 5 / \ 1 4 / \ ...原创 2020-05-05 16:04:08 · 274 阅读 · 0 评论 -
力扣 面试题 08.12. 八皇后(回溯&&剪枝&&深度搜索)
设计一种算法,打印 N皇后在 N × N棋盘上的各种摆法,其中每个皇后都不同行、不同列,也不在对角线上。这里的“对角线”指的是所有的对角线,不只是平分整个棋盘的那两条对角线。注意:本题相对原题做了扩展示例: 输入:4 输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]] 解释: 4 皇后问题存在如下两个不同的解法...原创 2020-04-30 20:57:59 · 412 阅读 · 0 评论 -
力扣 #36. 有效的数独(状态记录)
#36 有效的数独判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。上图是一个部分填充的有效的数独。数独部分空格内已填入了数字,空白格用 '.'表示。示例 1:输入:[ ["5","3",".","....原创 2020-04-30 19:47:33 · 198 阅读 · 0 评论 -
力扣 #46. 全排列(回溯法&&剪枝)
#46. 全排列给定一个 没有重复 数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]]思路:一般输出所有结果的题目,都是用回溯算法进行深度搜索。回溯算法一般是如下过程:def backtrack(路径, 选择列表): ...原创 2020-04-30 15:56:57 · 300 阅读 · 0 评论 -
力扣 #22 括号生成(回溯法//深度遍历 && 剪枝)
#22 括号生成数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。示例:输入:n = 3输出:[ "((()))", "(()())", "(())()", "()(())", "()()()" ]思路:生成括号就是典型的回溯算法。也可以叫深度遍历。搭配合...原创 2020-04-30 11:46:10 · 355 阅读 · 0 评论 -
力扣 #202 快乐数(双指针&快慢指针 || 哈希表)
# 202. 快乐数编写一个算法来判断一个数n是不是快乐数。「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为1,那么这个数就是快乐数。如果 n 是快乐数就返回 True;不是,则返回False。示例:输入:19输出:true解释:12 + 92 = 8282 + 22...原创 2020-04-30 10:25:53 · 273 阅读 · 0 评论 -
力扣 # 1095. 山脉数组中查找目标值(二分查找)
# 1095. 山脉数组中查找目标值给你一个山脉数组mountainArr,请你返回能够使得 mountainArr.get(index)等于 target最小的下标 index值。如果不存在这样的下标 index,就请返回 -1。什么是山脉数组呢?就是先升序再降序的数组,比如[1,2,3,4,5,3,1]。注意:你将不能直接访问该山脉数组,必须通过 MountainArray 接...原创 2020-04-29 12:25:34 · 331 阅读 · 0 评论 -
力扣 #23 合并K个排序链表(分治法/小根堆/升级版合并两个有序链表)
#23 合并K个排序链表合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。示例:输入:[ 1->4->5, 1->3->4, 2->6]输出: 1->1->2->3->4->4->5->6思路方法1:尾部合并法从尾部开始合并,合并后的链表放在尾部,数组长度逻辑上减1。使用...原创 2020-04-26 17:01:12 · 336 阅读 · 0 评论 -
力扣 #199 二叉树的右视图(层序遍历的经典应用)
# 199 二叉树的右视图给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。示例:输入: [1,2,3,null,5,null,4]输出: [1, 3, 4]解释: 1 <--- / \2 3 <--- \ \ 5 4 <---**...原创 2020-04-22 12:30:16 · 192 阅读 · 0 评论 -
力扣 #200岛屿数量 (深度优先遍历+沉岛思想)
深度优先搜索遍历+沉岛思想解决岛屿问题。原创 2020-04-20 10:14:04 · 452 阅读 · 0 评论 -
力扣 #9. 回文数 (数字原地逆序)
#9. 回文数判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。示例 1:输入: 121输出: true示例 2:输入: -121输出: false解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。示例 3:输入: 10输出: false解释: 从右向左读, 为 01 。因此它不是一个回文数...原创 2020-04-19 23:35:01 · 580 阅读 · 0 评论 -
力扣 #56 合并区间
快速排序+lambda表达式原创 2020-04-16 10:37:59 · 204 阅读 · 0 评论 -
力扣 #2 两数相加 (简单版加法实现)
# 2 两数相加给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 ->...原创 2020-04-14 22:43:05 · 388 阅读 · 1 评论 -
力扣 #445 两数相加 Ⅱ(力扣#2 两数相加进阶版)
# 445 两数相加 II给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。你可以假设除了数字 0 之外,这两个数字都不会以零开头。进阶:如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。示例:输入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -&...原创 2020-04-14 22:21:26 · 166 阅读 · 0 评论 -
LeetCode #887 鸡蛋掉落
LeetCode 每日一题没思路,不会做,先把代码搬上来。class Solution { public int superEggDrop(int K, int N) { return dp(K, N); } Map<Integer, Integer> memo = new HashMap(); public int dp(int ...原创 2020-04-11 10:00:26 · 134 阅读 · 0 评论 -
LeetCode #151 翻转字符串里的单词
难度 中等给定一个字符串,逐个翻转字符串中的每个单词。示例 1:输入: "the sky is blue"输出: "blue is sky the"示例 2:输入: " hello world! "输出: "world! hello"解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。示例 3:输入: "a good example"...原创 2020-04-10 11:15:22 · 125 阅读 · 0 评论