算法 划分字母区间 给你一个字符串 s。 我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。 例如,字符串 "ababcc" 能够被分为 ["abab", "cc"],但类似 ["aba", "bcc"] 或 ["ab", "ab", "cc"] 的划分是非法的。 注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s。 返回一个表示每个字符串片段长度的列表。 示例 1: 输入:s = "ababcbacadefegdehijhklij" 输出:[9,7,
算法 删除链表的倒数第 N 个结点 给你一个链表的头节点 head,删除链表的倒数第 n 个结点,并且返回链表的头节点。 示例 1: 输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5] 示例 2: 输入:head = [1], n = 1 输出:[] 示例 3: 输入:head = [1,2], n = 1 输出:[1] 提示: * 链表中结点的数目为 sz * 1 <= sz <= 30 * 0 <
算法 跳跃游戏 II 给定一个长度为 n 的 0 索引整数数组 nums。 初始位置在下标 0。 每个元素 nums[i] 表示从索引 i 向后跳转的最大长度。 也就是说,如果你在索引 i 处,可以跳转到任意满足下面条件的位置 i + j: * 0 <= j <= nums[i] * i + j < n 返回到达 n - 1 的最小跳跃次数。 测试用例保证可以到达 n - 1。 示例 1: 输入:nums = [2,3,1,1,4] 输出:2 解释:
算法 两数相加 给你两个非空的链表 l1 和 l2,表示两个非负整数。 它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。 示例 1: 输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807。 示例 2: 输入:l1 = [0], l2 = [0] 输出:[0] 示例 3: 输入:l1 = [9,9,9,
算法 跳跃游戏 给你一个非负整数数组 nums。 你最初位于数组的第一个下标。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标。 如果可以,返回 true;否则,返回 false。 示例 1: 输入:nums = [2,3,1,1,4] 输出:true 解释:可以先跳 1 步,从下标 0 到达下标 1,然后再从下标 1 跳 3 步到达最后一个下标。 示例 2: 输入:nums = [3,2,1,0,4] 输出:false 解释:无论怎样,总会到达下标为 3
算法 合并两个有序链表 将两个升序链表 l1 和 l2 合并为一个新的升序链表并返回。 新链表是通过拼接给定的两个链表的所有节点组成的,不需要创建新的数据节点。 两个链表都按照非递减顺序排列,也就是允许存在相等的节点值。 示例 1: 输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4] 示例 2: 输入:l1 = [], l2 = [] 输出:[] 示例 3: 输入:l1 = [], l2 = [0] 输出:[0] 提示: * 两个链表的节点数目范围是 [0, 50] * -100 <= Node.val <
贪心 买卖股票的最佳时机 给定一个数组 prices,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择某一天买入这只股票,并选择在未来的某一个不同的日子卖出这只股票。 请设计一个算法,计算你所能获取的最大利润。 如果不能获取任何利润,返回 0。 示例 1: 输入:prices = [7,1,5,3,6,4] 输出:5 解释:在第 2 天价格为 1 时买入,在第 5 天价格为 6 时卖出,最大利润为 6 - 1 = 5。 注意不能计算 7 - 1 = 6,因为卖出必须发生在买入之后。 示例
链表 环形链表 II 给定一个链表的头节点 head,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置,索引从 0 开始。 如果 pos 是 -1,则在该链表中没有环。 注意: * pos 不作为参数进行传递。 * pos 仅仅是为了标识链表的实际情况。 * 不允许修改链表。 示例 1: 输入:head = [3,2,0,-4], pos = 1 输出:返回索引为 1 的链表节点 解释:链表中有一个环,其尾部连接到第二个节点。 示例 2: 输入:head
动态规划 最长有效括号 给你一个只包含 '(' 和 ')' 的字符串 s。 请你找出最长有效括号子串的长度。 有效括号子串必须满足: * 格式正确 * 连续 * 左右括号能够正确匹配 例如,"(()())" 是格式正确的括号字符串。 示例 1: 输入:s = "(()" 输出:2 解释:最长有效括号子串是 "()" 示例 2: 输入:s = ")()())" 输出:4 解释:最长有效括号子串是 "()()" 示例 3: 输入:s = "" 输出:0 提示:
链表 环形链表 给你一个链表的头节点 head,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置,索引从 0 开始。 注意: * pos 不作为参数进行传递。 * pos 仅仅是为了标识链表的实际情况。 如果链表中存在环,则返回 true。 否则,返回 false。 示例 1: 输入:head = [3,2,0,-4], pos = 1 输出:true 解释:链表中有一个环,其尾部连接到第二个节点。 示例 2: 输入:head = [1,2], pos = 0 输出:
动态规划 分割等和子集 给你一个只包含正整数的非空数组 nums。 请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 每个数组元素只能放入其中一个子集,不能重复使用。 示例 1: 输入:nums = [1,5,11,5] 输出:true 解释:数组可以分割成 [1,5,5] 和 [11]。 示例 2: 输入:nums = [1,2,3,5] 输出:false 解释:数组不能分割成两个元素和相等的子集。 提示: * 1 <= nums.length <= 200 * 1 <= nums[i] <= 100 动态规划(0-
链表 回文链表 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 示例 1: 输入:head = [1,2,2,1] 输出:true 示例 2: 输入:head = [1,2] 输出:false 提示: 链表中节点数目在范围[1, 105] 内 0 <= Node.val <= 9 进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题? 解法一(数组 + 双指针): /** * Definition
算法 乘积最大子数组 给你一个整数数组 nums。 请你找出数组中乘积最大的非空连续子数组,并返回该子数组所对应的乘积。 该子数组中至少包含一个数字。 测试用例的答案是一个 32 位整数。 请注意,一个只包含一个元素的数组的乘积就是这个元素的值。 示例 1: 输入:nums = [2,3,-2,4] 输出:6 解释:子数组 [2,3] 有最大乘积 6。 示例 2: 输入:nums = [-2,0,-1] 输出:0 解释:结果不能为 2,因为 [-2,-1] 不是子数组。 提示: * 1 <= nums.length <= 2 * 10^
算法 反转链表 给你单链表的头节点 head。 请你反转链表,并返回反转后的链表。 示例 1: 输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1] 示例 2: 输入:head = [1,2] 输出:[2,1] 示例 3: 输入:head = [] 输出:[] 提示: * 链表中节点的数目范围是 [0, 5000] * -5000 <= Node.val <= 5000 进阶: 链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题? 解法一(迭代): /** * Definition for
算法 最长递增子序列 给你一个整数数组 nums,找到其中最长严格递增子序列的长度。 子序列是由数组派生而来的序列,删除或不删除数组中的元素,并且不改变其余元素的顺序。 例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 示例 1: 输入:nums = [10,9,2,5,3,7,101,18] 输出:4 解释:最长递增子序列是 [2,3,7,101],因此长度为 4。 示例 2: 输入:nums = [0,1,0,3,
算法 相交链表 给你两个单链表的头节点 headA 和 headB。 请你找出并返回两个单链表相交的起始节点。 如果两个链表不存在相交节点,返回 null。 题目数据保证整个链式结构中不存在环。 注意: * 函数返回结果后,链表必须保持其原始结构。 * 链表相交指的是两个链表从某个节点开始,后续节点在内存中是同一批节点。 * 不能只比较节点值是否相等,必须比较节点本身是否相同。 自定义评测中会使用: * intersectVal:相交的起始节点的值。如果不存在相交节点,这一值为 0 * listA:第一个链表 * listB:第二个链表 * skipA:在 listA 中从头节点开始跳到交叉节点的节点数 * skipB:在 listB 中从头节点开始跳到交叉节点的节点数 评测系统会根据这些输入创建链式数据结构,并将两个头节点 headA 和 headB 传递给程序。 示例 1: 输入:intersectVal = 8, listA = [4,1,8,4,
算法 单词拆分 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。 如果可以利用字典中出现的一个或多个单词拼接出 s,则返回 true。 注意: * 不要求字典中出现的单词全部都使用。 * 字典中的单词可以重复使用。 示例 1: 输入:s = "leetcode", wordDict = ["leet", "code"] 输出:true 解释:返回 true 因为 "leetcode" 可以由 "leet" 和 "code" 拼接成。 示例 2: 输入:s = "applepenapple&
矩阵 搜索二维矩阵 II 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。 该矩阵具有以下特性: * 每行的元素从左到右升序排列。 * 每列的元素从上到下升序排列。 示例 1: 输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5 输出:true 示例 2: 输入:matrix = [[1,4,
动态规划 零钱兑换 给你一个整数数组 coins,表示不同面额的硬币;以及一个整数 amount,表示总金额。 计算并返回可以凑成总金额所需的最少硬币个数。 如果没有任何一种硬币组合能组成总金额,返回 -1。 你可以认为每种硬币的数量是无限的。 示例 1: 输入:coins = [1, 2, 5], amount = 11 输出:3 解释:11 = 5 + 5 + 1 示例 2: 输入:coins = [2], amount = 3 输出:-1 示例 3: 输入:coins = [1], amount = 0 输出:0 提示: * 1 <= coins.length
矩阵 旋转图像 给定一个 n x n 的二维矩阵 matrix 表示一个图像。 请你将图像顺时针旋转 90 度。 你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。 请不要使用另一个矩阵来旋转图像。 示例 1: 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[[7,4,1],[8,5,2],[9,6,3]] 示例 2: 输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,
动态规划 完全平方数 给你一个整数 n,返回和为 n 的完全平方数的最少数量。 完全平方数是一个整数,其值等于另一个整数的平方。换句话说,它的值等于一个整数自乘的积。 例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。 示例 1: 输入:n = 12 输出:3 解释:12 = 4 + 4 + 4 示例 2: 输入:n = 13 输出:2 解释:13 = 4 + 9 提示: * 1 <= n <= 10^
矩阵 螺旋矩阵 给你一个 m 行 n 列的矩阵 matrix,请按照顺时针螺旋顺序,返回矩阵中的所有元素。 示例 1: 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5] 示例 2: 输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]] 输出:[1,2,
矩阵 矩阵置零 给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。 请使用原地算法。 示例 1: 输入:matrix = [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]] 示例 2: 输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]] 输出:
动态规划 杨辉三角 给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例 1: 输入:numRows = 5 输出:[[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 示例 2: 输入:numRows = 1 输出:[[1]] 提示: * 1 <= numRows <= 30 动态规划-逐行构造: class Solution { public:
数组 缺失的第一个正数 给你一个未排序的整数数组 nums,请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n),并且只使用常数级别额外空间的解决方案。 示例 1: 输入:nums = [1,2,0] 输出:3 解释:范围 [1,2] 中的数字都在数组中。 示例 2: 输入:nums = [3,4,-1,1] 输出:2 解释:1 在数组中,但 2 没有。 示例 3: 输入:nums = [7,8,9,11,12] 输出:1 解释:最小的正数