LeetCode动态规划
PigyChan
谢谢你看我的博客
展开
-
PigyChan_LeetCode 931. 下降路径最小和
931. 下降路径最小和难度中等给定一个方形整数数组 A,我们想要得到通过 A 的下降路径的最小和。下降路径可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列。示例:输入:[[1,2,3],[4,5,6],[7,8,9]]输出:12解释:可能的下降路径有:*[1,4,7], [1,4,8], [1,5,7], [1,5,8], [1,5,9]*[2,4,7], [2,4,8], [2,5,7], [2,5,8], [2,5,9],原创 2020-10-23 20:53:35 · 100 阅读 · 0 评论 -
PigyChan_LeetCode 1139. 最大的以 1 为边界的正方形
1139. 最大的以 1 为边界的正方形难度中等给你一个由若干 0 和 1 组成的二维网格 grid,请你找出边界全部由 1 组成的最大 正方形 子网格,并返回该子网格中的元素数量。如果不存在,则返回 0。示例 1:输入:grid = [[1,1,1],[1,0,1],[1,1,1]]输出:9示例 2:输入:grid = [[1,1,0,0]]输出:1提示:*1 <= grid.length <= 100*1 <= grid[0].length <= 100原创 2020-10-23 20:53:15 · 114 阅读 · 0 评论 -
PigyChan_LeetCode 357. 计算各个位数不同的数字个数
357. 计算各个位数不同的数字个数难度中等给定一个非负整数 n,计算各位数字都不同的数字 x 的个数,其中 0 ≤ x < 10n 。示例:输入: 2输出: 91解释: 答案应为除去 11,22,33,44,55,66,77,88,99 外,在 [0,100) 区间内的所有数字。个人思路:设变量tol为位数等于n的 n-1个数的所有排序 即:n=3时 abc=ab+ac+bcdp[i]=dp[i-1]tol10代码1.0class Solution {public:原创 2020-10-23 20:52:40 · 127 阅读 · 0 评论 -
PigyChan_LeetCode 935. 骑士拨号器
935. 骑士拨号器难度中等国际象棋中的骑士可以按下图所示进行移动:这一次,我们将 “骑士” 放在电话拨号盘的任意数字键(如上图所示)上,接下来,骑士将会跳 N-1 步。每一步必须是从一个数字键跳到另一个数字键。每当它落在一个键上(包括骑士的初始位置),都会拨出键所对应的数字,总共按下 N 位数字。你能用这种方式拨出多少个不同的号码?因为答案可能很大,所以输出答案模 10^9 + 7。示例 1:输入:1输出:10示例 2:输入:2输出:20示例 3:输入:3输出:46提示:原创 2020-10-23 20:52:17 · 178 阅读 · 0 评论 -
PigyChan_LeetCode 309. 最佳买卖股票时机含冷冻期
309. 最佳买卖股票时机含冷冻期难度中等给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):*你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。*卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。示例:输入: [1,2,3,0,2]输出: 3解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]思路1.0:老朋友股票,特殊的部分在原创 2020-10-22 18:08:42 · 94 阅读 · 0 评论 -
PigyChan_LeetCode 62. 不同路径
62. 不同路径难度中等一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?例如,上图是一个7 x 3 的网格。有多少可能的路径?示例 1:输入: m = 3, n = 2输出: 3解释:从左上角开始,总共有 3 条路径可以到达右下角。向右 -> 向右 -> 向下向右 -> 向下 -> 向右向下原创 2020-10-22 18:06:36 · 73 阅读 · 0 评论 -
PigyChan_LeetCode 718. 最长重复子数组
718. 最长重复子数组难度中等给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。示例:输入:A: [1,2,3,2,1]B: [3,2,1,4,7]输出:3解释:长度最长的公共子数组是 [3, 2, 1] 。提示:*1 <= len(A), len(B) <= 1000*0 <= A[i], B[i] < 100思路1.0:(1)设较长数组为A,较短数组为B,dp[n]即为B的前n位中,长度最长的公共子数组长度。(2)利用原创 2020-10-22 18:02:47 · 127 阅读 · 0 评论 -
PigyChan_LeetCode 416. 分割等和子集
416. 分割等和子集难度中等给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。注意:1.每个数组中的元素不会超过 1002.数组的大小不会超过 200示例 1:输入: [1, 5, 11, 5]输出: true解释: 数组可以分割成 [1, 5, 5] 和 [11].示例 2:输入: [1, 2, 3, 5]输出: false解释: 数组不能分割成两个元素和相等的子集.思路1.0:在做石头对撞哪一题的方法可以用上。01背包滚动数组原创 2020-10-22 17:57:12 · 108 阅读 · 0 评论 -
PigyChan_LeetCode 343. 整数拆分
343. 整数拆分难度中等给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。示例 1:输入: 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1。示例 2:输入: 10输出: 36解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。说明: 你可以假设 n 不小于 2 且不大于 58。思路1.0:印象里将整数拆分相乘以得到最大乘积,最优选择是拆成 3。代码1.0(已过)class Solution {原创 2020-10-22 17:56:03 · 89 阅读 · 0 评论 -
PigyChan_LeetCode 剑指 Offer 63. 股票的最大利润
剑指 Offer 63. 股票的最大利润难度中等假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?示例 1:输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。示例 2:输入: [7,6,4,3,1]输出: 0解释: 在这种情况下, 没有交易完成, 所以最大利润为原创 2020-10-22 17:55:04 · 79 阅读 · 0 评论 -
PigyChan_LeetCode 279. 完全平方数
279. 完全平方数难度中等给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。示例 1:输入: n = 12输出: 3解释: 12 = 4 + 4 + 4.示例 2:输入: n = 13输出: 2解释: 13 = 4 + 9.思路1.0:从中可知,dp[n]=dp[n-j*j]+1考虑到特殊的dp[12]=4+4+4而不是9+1+1+1+1,可见并不一定拿了最大平方数的那个组合就是最短的,所以需要从上原创 2020-10-22 17:53:52 · 84 阅读 · 0 评论 -
PigyChan_LeetCode 1504. 统计全 1 子矩形
1504. 统计全 1 子矩形给你一个只包含 0 和 1 的 rows * columns 矩阵 mat ,请你返回有多少个 子矩形 的元素全部都是 1 。示例 1:输入:mat = [[1,0,1],[1,1,0],[1,1,0]]输出:13解释:有 6 个 1x1 的矩形。有 2 个 1x2 的矩形。有 3 个 2x1 的矩形。有 1 个 2x2 的矩形。有 1 个 3x1 的矩形。矩形数目总共 = 6 + 2 + 3 + 1 + 1 = 13 。示例 2:输入:mat =原创 2020-10-22 17:50:10 · 85 阅读 · 0 评论 -
PigyChan_LeetCode 213. 打家劫舍 II
213. 打家劫舍 II你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。示例 1:输入: [2,3,2]输出: 3解释: 你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是原创 2020-10-22 17:45:52 · 90 阅读 · 0 评论 -
PigyChan_LeetCode 494. 目标和
494. 目标和给定一个非负整数数组,a1, a2, …, an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。返回可以使最终数组和为目标数 S 的所有添加符号的方法数。示例:输入:nums: [1, 1, 1, 1, 1], S: 3输出:5解释:-1+1+1+1+1 = 3+1-1+1+1+1 = 3+1+1-1+1+1 = 3+1+1+1-1+1 = 3+1+1+1+1-1 = 3一共有5种方法让最终原创 2020-10-22 17:40:53 · 56 阅读 · 0 评论 -
PigyChan_LeetCode 1049. 最后一块石头的重量 II
1049. 最后一块石头的重量 II有一堆石头,每块石头的重量都是正整数。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:*如果 x == y,那么两块石头都会被完全粉碎;*如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。最后,最多只会剩下一块石头。返回此石头最小的可能重量。如果没有石头剩下,就返回 0。示例:输入:[2,7,4,1,8,1]输出:1解释:原创 2020-10-01 22:43:17 · 203 阅读 · 0 评论 -
PigyChan_LeetCode 1262. 可被三整除的最大和
1262. 可被三整除的最大和给你一个整数数组 nums,请你找出并返回能被三整除的元素最大和。示例 1:输入:nums = [3,6,5,1,8]输出:18解释:选出数字 3, 6, 1 和 8,它们的和是 18(可被 3 整除的最大和)。示例 2:输入:nums = [4]输出:0解释:4 不能被 3 整除,所以无法选出数字,返回 0。示例 3:输入:nums = [1,2,3,4,4]输出:12解释:选出数字 1, 3, 4 以及 4,它们的和是 12(可被 3 整除的最大和原创 2020-10-01 22:37:31 · 331 阅读 · 0 评论 -
PigyChan_LeetCode 714. 买卖股票的最佳时机含手续费
714. 买卖股票的最佳时机含手续费给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。返回获得利润的最大值。注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。示例 1:输入: prices = [1, 3, 2, 8, 4, 9], fee = 2输出: 8解释: 能原创 2020-10-01 22:33:15 · 80 阅读 · 0 评论 -
PigyChan_LeetCode 1105. 填充书架
1105. 填充书架附近的家居城促销,你买回了一直心仪的可调节书架,打算把自己的书都整理到新的书架上。你把要摆放的书 books 都整理好,叠成一摞:从上往下,第 i 本书的厚度为 books[i][0],高度为 books[i][1]。按顺序 将这些书摆放到总宽度为 shelf_width 的书架上。先选几本书放在书架上(它们的厚度之和小于等于书架的宽度 shelf_width),然后再建一层书架。重复这个过程,直到把所有的书都放在书架上。需要注意的是,在上述过程的每个步骤中,摆放书的顺序与你整原创 2020-10-01 22:31:47 · 126 阅读 · 0 评论 -
PigyChan_LeetCode 650. 只有两个键的键盘
650. 只有两个键的键盘最初在一个记事本上只有一个字符 ‘A’。你每次可以对这个记事本进行两种操作:1.Copy All (复制全部) : 你可以复制这个记事本中的所有字符(部分的复制是不允许的)。2.Paste (粘贴) : 你可以粘贴你上一次复制的字符。给定一个数字 n 。你需要使用最少的操作次数,在记事本中打印出恰好 n 个 ‘A’。输出能够打印出 n 个 ‘A’ 的最少操作次数。示例 1:输入: 3输出: 3解释:最初, 我们只有一个字符 ‘A’。第 1 步, 我们使用 C原创 2020-10-01 22:26:38 · 73 阅读 · 0 评论 -
PigyChan_LeetCode 467. 环绕字符串中唯一的子字符串难度中等
467. 环绕字符串中唯一的子字符串难度中等把字符串 s 看作是“abcdefghijklmnopqrstuvwxyz”的无限环绕字符串,所以 s 看起来是这样的:"…zabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd…".现在我们有了另一个字符串 p 。你需要的是找出 s 中有多少个唯一的 p 的非空子串,尤其是当你的输入是字符串 p ,你需要输出字符串 s 中 p 的不同的非空子串的数目。注意: p 仅由小写的英文字母组成,p 的大小原创 2020-10-01 22:23:27 · 103 阅读 · 0 评论 -
PigyChan_LeetCode 剑指 Offer 14- II. 剪绳子 II
剑指 Offer 14- II. 剪绳子 II难度中等给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m - 1] 。请问 k[0]k[1]…*k[m - 1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。示例 1:输入: 2原创 2020-10-01 22:20:20 · 128 阅读 · 0 评论 -
PigyChan_LeetCode 1314. 矩阵区域和
1314. 矩阵区域和难度中等给你一个 m * n 的矩阵 mat 和一个整数 K ,请你返回一个矩阵 answer ,其中每个 answer[i][j] 是所有满足下述条件的元素 mat[r][c] 的和:*i - K <= r <= i + K, j - K <= c <= j + K*(r, c) 在矩阵内。示例 1:输入:mat = [[1,2,3],[4,5,6],[7,8,9]], K = 1输出:[[12,21,16],[27,45,33],[24,39原创 2020-10-01 19:31:26 · 134 阅读 · 0 评论 -
PigyChan_LeetCode 978. 最长湍流子数组
978. 最长湍流子数组难度中等当 A 的子数组 A[i], A[i+1], …, A[j] 满足下列条件时,我们称其为湍流子数组: * 若 i <= k < j,当 k 为奇数时, A[k] > A[k+1],且当 k 为偶数时,A[k] < A[k+1]; * 或 若 i <= k < j,当 k 为偶数时,A[k] > A[k+1] ,且当 k 为奇数时, A[k] < A[k+1]。也就是说,如果比较符号在子数组中的每个相邻元素对之间翻转,原创 2020-10-01 19:23:08 · 63 阅读 · 0 评论 -
PigyChan_LeetCode 300. 最长上升子序列
最长上升子序列难度中等给定一个无序的整数数组,找到其中最长上升子序列的长度。示例:输入: [10,9,2,5,3,7,101,18]输出: 4解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。说明:*可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。*你算法的时间复杂度应该为 O(n2) 。进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗?个人思路:*例 F8=4,F8=F7(a[8]<a[7])*例 F6=3,F6=F5+1.原创 2020-10-01 19:13:41 · 74 阅读 · 0 评论