动态规划

A collection of 19 posts
算法

最长公共子序列

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

不同路径

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

最长有效括号

给你一个只包含 '(' 和 ')' 的字符串 s。 请你找出最长有效括号子串的长度。 有效括号子串必须满足: * 格式正确 * 连续 * 左右括号能够正确匹配 例如,"(()())" 是格式正确的括号字符串。 示例 1: 输入:s = "(()" 输出:2 解释:最长有效括号子串是 "()" 示例 2: 输入:s = ")()())" 输出:4 解释:最长有效括号子串是 "()()" 示例 3: 输入:s = "" 输出:0 提示:
9 min read
算法

分割等和子集

给你一个只包含正整数的非空数组 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-
8 min read
算法

乘积最大子数组

给你一个整数数组 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^
8 min read
动态规划

单词拆分

给你一个字符串 s 和一个字符串列表 wordDict 作为字典。 如果可以利用字典中出现的一个或多个单词拼接出 s,则返回 true。 注意: * 不要求字典中出现的单词全部都使用。 * 字典中的单词可以重复使用。 示例 1: 输入:s = "leetcode", wordDict = ["leet", "code"] 输出:true 解释:返回 true 因为 "leetcode" 可以由 "leet" 和 "code" 拼接成。 示例 2: 输入:s = "applepenapple&
7 min read
算法

零钱兑换

给你一个整数数组 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
7 min read
算法

石子游戏 IV

Alice 和 Bob 两个人轮流玩一个游戏,Alice 先手。 一开始,有 n 个石子堆在一起。每个人轮流操作,正在操作的玩家可以从石子堆里拿走 任意 非零 平方数 个石子。 如果石子堆里没有石子了,则无法操作的玩家输掉游戏。 给你正整数 n ,且已知两个人都采取最优策略。如果 Alice 会赢得比赛,那么返回 True ,否则返回 False 。 示例 1: 输入:n = 1 输出:true 解释:Alice 拿走 1 个石子并赢得胜利,因为 Bob 无法进行任何操作。 示例 2: 输入:n = 2 输出:false
8 min read
算法

石子游戏 II

Alice 和 Bob 继续他们的石子游戏。许多堆石子 排成一行,每堆都有正整数颗石子 piles[i]。游戏以谁手中的石子最多来决出胜负。 Alice 和 Bob 轮流进行,Alice 先开始。最初,M = 1。 在每个玩家的回合中,该玩家可以拿走剩下的 前 X 堆的所有石子,其中 1 <= X <= 2M。然后,令 M = max(M, X)。 游戏一直持续到所有石子都被拿走。 假设 Alice 和 Bob 都发挥出最佳水平,返回 Alice 可以得到的最大数量的石头。 示例 1: 输入:piles = [2,
5 min read
算法

石子游戏Ⅲ

Alice 和 Bob 继续他们的石子游戏。几堆石子 排成一行 ,每堆石子都对应一个得分,由数组 stoneValue 给出。 Alice 和 Bob 轮流取石子,Alice 总是先开始。在每个玩家的回合中,该玩家可以拿走剩下石子中的的前 1、2 或 3 堆石子 。比赛一直持续到所有石头都被拿走。 每个玩家的最终得分为他所拿到的每堆石子的对应得分之和。每个玩家的初始分数都是 0 。 比赛的目标是决出最高分,得分最高的选手将会赢得比赛,比赛也可能会出现平局。 假设 Alice 和 Bob 都采取 最优策略 。 如果 Alice 赢了就返回 "Alice" *,Bob 赢了就返回 "Bob",*分数相同返回 "Tie&
4 min read
动态规划

预测赢家

给你一个整数数组 nums 。玩家 1 和玩家 2 基于这个数组设计了一个游戏。 玩家 1 和玩家 2 轮流进行自己的回合,玩家 1 先手。开始时,两个玩家的初始分值都是 0 。每一回合,玩家从数组的任意一端取一个数字(即,nums[0] 或 nums[nums.length - 1]),取到的数字将会从数组中移除(数组长度减 1 )。玩家选中的数字将会加到他的得分上。当数组中没有剩余数字可取时,游戏结束。 如果玩家 1 能成为赢家,返回 true 。如果两个玩家得分相等,同样认为玩家 1 是游戏的赢家,也返回 true 。你可以假设每个玩家的玩法都会使他的分数最大化。 示例 1: 输入:nums
6 min read