loser

loser

字符串解码

给定一个经过编码的字符串,返回它解码后的字符串。 编码规则为:k[encoded_string],表示方括号内部的 encoded_string 恰好重复 k 次。k 保证为正整数。 可以认为输入字符串总是有效,输入字符串中没有额外空格,且方括号总是符合格式要求。 原始数据不包含数字,所有数字只表示重复次数 k,例如不会出现 3a 或 2[4] 这样的输入。 测试用例保证输出字符串的长度不会超过 10^5。 示例 1: 输入:s = "3[a]2[bc]" 输出:"aaabcbc" 示例 2: 输入:s = "3[a2[
8 min read
递归

验证二叉搜索树

给你一个二叉树的根节点 root,判断其是否是一个有效的二叉搜索树。 有效二叉搜索树定义如下: * 节点的左子树只包含严格小于当前节点的数。 * 节点的右子树只包含严格大于当前节点的数。 * 所有左子树和右子树自身也必须是二叉搜索树。 示例 1: 输入:root = [2,1,3] 输出:true 示例 2: 输入:root = [5,1,4,null,null,3,6] 输出:false 解释:根节点的值是 5,但是右子节点的值是 4。 提示: * 树中节点数目范围在 [1, 10^4] 内 * -2^31 <= Node.val <= 2^31 - 1 解法一(
9 min read
递归

将有序数组转换为二叉搜索树

给你一个整数数组 nums,其中元素已经按 严格递增 顺序排列。请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡二叉树指一棵二叉树每个节点的左右两个子树的高度差的绝对值不超过 1。 示例 输入:nums = [-10,-3,0,5,9] 输出:[0,-3,9,-10,null,5] 解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案。 输入:nums = [1,3] 输出:[3,1] 解释:[1,null,3] 和 [3,1] 都是高度平衡二叉搜索树。 提示
4 min read

数据流中的中位数

中位数是有序整数列表中的中间值。 如果列表大小是偶数,则没有中间值,中位数是两个中间值的平均值。 例如: * arr = [2,3,4] 的中位数是 3 * arr = [2,3] 的中位数是 (2 + 3) / 2 = 2.5 实现 MedianFinder 类: * MedianFinder() 初始化对象 * void addNum(int num) 将数据流中的整数 num 添加到数据结构中 * double findMedian() 返回到目前为止所有元素的中位数 示例 1: 输入: ["MedianFinder", "addNum", "addNum", "findMedian"
7 min read
算法

二叉树的直径

给你一棵二叉树的根节点 root,返回该树的直径。 二叉树的直径,是指树中任意两个节点之间最长路径的长度。 这条路径可能经过根节点 root,也可能不经过根节点。 两节点之间路径的长度由它们之间的边数表示。 示例 1: 输入:root = [1,2,3,4,5] 输出:3 解释:取路径 [4,2,1,3] 或 [5,2,1,3],长度为 3。 示例 2: 输入:root = [1,2] 输出:1 提示: * 树中节点数目在范围 [1, 10^4] 内 * -100 <= Node.
7 min read

有效的括号

给定一个只包括 '(',')','{','}','[',']' 的字符串 s。 判断字符串是否有效。 有效字符串需要满足: 1. 左括号必须用相同类型的右括号闭合。 2. 左括号必须以正确的顺序闭合。 3. 每个右括号都有一个对应的相同类型的左括号。 示例 1: 输入:s = "()" 输出:true 示例 2: 输入:s = "()[]{}" 输出:true 示例 3: 输入:s = "(]" 输出:false 示例 4: 输入:
6 min read
迭代

对称二叉树

给你一个二叉树的根节点 root,检查它是否轴对称。 轴对称可以理解为:二叉树的左子树和右子树互为镜像。 示例 1: 输入:root = [1,2,2,3,4,4,3] 输出:true 示例 2: 输入:root = [1,2,2,null,3,null,3] 输出:false 提示: * 树中节点数目在范围 [1, 1000] 内 * -100 <= Node.val <= 100 进阶: 可以运用递归和迭代两种方法解决这个问题吗? 解法一(递归 DFS): /** * Definition for a
8 min read
动态规划

最长公共子序列

给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。 如果不存在公共子序列,返回 0。 一个字符串的子序列是指:在不改变字符相对顺序的情况下,删除某些字符,也可以不删除任何字符后组成的新字符串。 例如,"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。 两个字符串的公共子序列,是这两个字符串共同拥有的子序列。 示例 1: 输入:text1 = "abcde", text2 = "ace" 输出:3 解释:最长公共子序列是 "ace"
8 min read
递归

二叉树的中序遍历

给定一个二叉树的根节点 root,返回它的中序遍历结果。 中序遍历的访问顺序是: 左子树 -> 根节点 -> 右子树 示例 1: 输入:root = [1,null,2,3] 输出:[1,3,2] 示例 2: 输入:root = [] 输出:[] 示例 3: 输入:root = [1] 输出:[1] 提示: * 树中节点数目在范围 [0, 100] 内 * -100 <= Node.val <= 100 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 解法一(递归): /** * Definition
7 min read
动态规划

最长回文子串

给你一个字符串 s,找到 s 中最长的回文子串。 回文串指的是正着读和反着读都相同的字符串。 子串必须是原字符串中连续的一段。 示例 1: 输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。 示例 2: 输入:s = "cbbd" 输出:"bb" 提示: * 1 <= s.length <= 1000 * s 仅由数字和英文字母组成 解法一(中心扩展): class Solution { public: string longestPalindrome(
9 min read
链表

LRU 缓存

请你设计并实现一个满足 LRU 最近最少使用约束的数据结构。 实现 LRUCache 类: * LRUCache(int capacity):以正整数作为容量 capacity 初始化 LRU 缓存 * int get(int key):如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 * void put(int key, int value):如果关键字 key 已经存在,则更新它的值;如果不存在,则插入这组 key-value 如果插入操作导致关键字数量超过 capacity,则应该逐出最久未使用的关键字。 get 和 put 必须以 O(1) 的平均时间复杂度运行。 示例: 输入:
8 min read
算法

不同路径

一个机器人位于一个 m x n 网格的左上角。 机器人每次只能向下或者向右移动一步。 机器人试图达到网格的右下角。 问总共有多少条不同的路径? 示例 1: 输入:m = 3, n = 7 输出:28 示例 2: 输入:m = 3, n = 2 输出:3 解释: 从左上角开始,总共有 3 条路径可以到达右下角。 1. 向右 -> 向下 -> 向下 2. 向下 -> 向下 -> 向右 3. 向下 -> 向右 -> 向下 示例
7 min read
算法

随机链表的复制

给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random。 该指针可以指向链表中的任何节点,也可以指向空节点。 请构造这个链表的深拷贝。 深拷贝应该正好由 n 个全新节点组成,其中每个新节点的值都设为其对应原节点的值。 新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。 复制链表中的指针都不应该指向原链表中的节点。 例如,如果原链表中有 X 和 Y 两个节点,其中: X.random -> Y 那么在复制链表中对应的两个节点 x 和 y,也应该满足: x.random -> y 返回复制链表的头节点。 输入和输出中的链表用 n 个节点表示,每个节点用一个 [val, random_index] 表示: * val:表示
9 min read
算法

下一个排列

整数数组的一个排列,就是将其所有成员以序列或线性顺序排列。 例如,arr = [1,2,3],以下这些都可以视作 arr 的排列: [1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 整数数组的下一个排列,是指其整数的下一个字典序更大的排列。 更正式地,如果数组的所有排列根据字典顺序从小到大排列在一个容器中,那么数组的下一个排列就是在这个有序容器中排在它后面的那个排列。 如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列,也就是按升序排列。 例如: * arr = [1,2,3] 的下一个排列是 [1,3,2] * arr = [2,3,1] 的下一个排列是 [3,1,2] * arr = [3,2,
8 min read