动态规划
动态规划
qxlxi
21届本,后端工程师 (专注于Java、Go、数据库、缓存、消息队列、网络、OS、算法、软件设计、DevOps、云原生、大数据、分布式系统架构设计等)
展开
-
【每日一题-leetcode】494. 目标和
494. 目标和难度中等419给定一个非负整数数组,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原创 2020-10-05 21:02:40 · 323 阅读 · 0 评论 -
【每日一题-leetcode】416. 分割等和子集
416. 分割等和子集难度中等421给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。注意:每个数组中的元素不会超过 100数组的大小不会超过 200示例 1:输入: [1, 5, 11, 5]输出: true解释: 数组可以分割成 [1, 5, 5] 和 [11].//先计算总和 如何是奇数说明不可能进行分隔,直接返回false//dp 1.找到重复子问题 2.dp状态定义与选择 3.dp方程//对于每个数只能选举一次,所以原创 2020-10-04 21:53:48 · 1653 阅读 · 0 评论 -
【每日一题-leetcode】376. 摆动序列
376. 摆动序列 ☆难度中等251如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。例如, [1,7,4,9,2,5] 是一个摆动序列,因为差值 (6,-3,5,-7,3) 是正负交替出现的。相反, [1,4,7,2,5]和 [1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。给定一个整数序列,返回作为摆动序列的最长子序列的长度。 通过原创 2020-10-03 21:21:51 · 406 阅读 · 0 评论 -
【每日一题-leetcode】646. 最长数对链
646. 最长数对链难度中等118给出 n 个数对。 在每一个数对中,第一个数字总是比第二个数字小。现在,我们定义一种跟随关系,当且仅当 b < c 时,数对(c, d) 才可以跟在 (a, b) 后面。我们用这种形式来构造一个数对链。给定一个对数集合,找出能够形成的最长数对链的长度。你不需要用到所有的数对,你可以以任何顺序选择其中的一些数对来构造。示例 :输入: [[1,2], [2,3], [3,4]]输出: 2解释: 最长的数对链是 [1,2] -> [3,4]//原创 2020-10-03 20:39:03 · 345 阅读 · 0 评论 -
【每日一题-leetcode】279. 完全平方数
279. 完全平方数难度中等613给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。示例 1:输入: n = 12输出: 3 解释: 12 = 4 + 4 + 4.示例 2:输入: n = 13输出: 2解释: 13 = 4 + 9.//dp//时间复杂度O(n*m)//空间复杂度O(n)public int numSquares(int n) { int [] dp = new原创 2020-10-02 19:58:52 · 399 阅读 · 0 评论 -
【每日一题-leetcode】413. 等差数列划分
413. 等差数列划分难度中等173如果一个数列至少有三个元素,并且任意两个相邻元素之差相同,则称该数列为等差数列。例如,以下数列为等差数列:1, 3, 5, 7, 97, 7, 7, 73, -1, -5, -9以下数列不是等差数列。1, 1, 2, 5, 7 //等差数列个数计算 //假设如果连续两个数之间的差相等 那么就是一个等差数列 //A[i]-A[i-1] == A[i-1]-A[i-2]; //dp[i]=dp[i-原创 2020-10-01 21:24:22 · 351 阅读 · 0 评论 -
【每日一题-leetcode】303. 区域和检索 - 数组不可变
303. 区域和检索 - 数组不可变难度简单192给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点。示例:给定 nums = [-2, 0, 3, -5, 2, -1],求和函数为 sumRange()sumRange(0, 2) -> 1sumRange(2, 5) -> -1sumRange(0, 5) -> -3 //初始化计算好,当前i-1的总和,当计算i,j之间的总和,需要将原创 2020-10-01 20:41:05 · 360 阅读 · 0 评论 -
【每日一题-leetcode】213. 打家劫舍 II
213. 打家劫舍 II难度中等384你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。示例 1:输入: [2,3,2]输出: 3解释: 你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 =原创 2020-09-29 21:55:12 · 337 阅读 · 0 评论 -
【每日一题-leetcode】72. 编辑距离
72. 编辑距离难度困难1080给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例 1:输入:word1 = "horse", word2 = "ros"输出:3解释:horse -> rorse (将 'h' 替换为 'r')rorse -> rose (删除 'r')rose -> ros (删除 'e') pub原创 2020-08-22 11:41:30 · 379 阅读 · 0 评论 -
【每日一题-leetcode】337. 打家劫舍 III
337. 打家劫舍 III打家劫舍 III难度中等487在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。示例 1:输入: [3,2,3,null,3,null,1] 3 /原创 2020-08-05 17:06:11 · 344 阅读 · 0 评论 -
【每日一题-leetcode】300. 最长上升子序列
300. 最长上升子序列难度中等858给定一个无序的整数数组,找到其中最长上升子序列的长度。示例:输入: [10,9,2,5,3,7,101,18]输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。//时间复杂度为O(N^2) public int lengthOfLIS(int[] nums) { if(nums == null || nums.length == 0){ return原创 2020-08-01 16:52:01 · 370 阅读 · 0 评论 -
【每日一题-leetcode】91. 解码方法
91. 解码方法解码方法难度中等440一条包含字母 A-Z 的消息通过以下方式进行了编码:'A' -> 1'B' -> 2...'Z' -> 26给定一个只包含数字的非空字符串,请计算解码方法的总数。示例 1:输入: "12"输出: 2解释: 它可以解码为 "AB"(1 2)或者 "L"(12)。dp public int numDecodings(String s) { int len = s.length();原创 2020-07-17 16:22:20 · 378 阅读 · 0 评论 -
【每日一题-leetcode】338. 比特位计数
338. 比特位计数比特位计数难度中等349给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。示例 1:输入: 2输出: [0,1,1]示例 2:输入: 5输出: [0,1,1,2,1,2]1.位运算// 问题分析 主要是计算出每个位数Num是否为1 并且当前的1的个数 //而本题的思路 显然不是按照这样做。而是把num分隔成多个数字来看当前的位数1的个数。 /原创 2020-07-16 11:32:22 · 375 阅读 · 0 评论 -
【每日一题-leetcode】44. 通配符匹配
44. 通配符匹配通配符匹配难度困难470给定一个字符串 (s) 和一个字符模式 § ,实现一个支持 ‘?’ 和 ‘*’ 的通配符匹配。'?' 可以匹配任何单个字符。'*' 可以匹配任意字符串(包括空字符串)。两个字符串完全匹配才算匹配成功。说明:s 可能为空,且只包含从 a-z 的小写字母。p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。示例 1:输入:s = "aa"p = "a"输出: false解释: "a" 无法匹配 "aa" 整个字符原创 2020-07-15 16:27:58 · 342 阅读 · 0 评论 -
【左神算法】有一排正数,玩家A和玩家B都可以看到。 每位玩家在拿走数字的时候,都只能从最左和最右的数中选择一个。 玩家A先拿,玩家B再拿,两人交替拿走所有的数字, 两人都力争自己拿到的数的总和比对方多
1.问题有一排正数,玩家A和玩家B都可以看到。每位玩家在拿走数字的时候,都只能从最左和最右的数中选择一个。玩家A先拿,玩家B再拿,两人交替拿走所有的数字,两人都力争自己拿到的数的总和比对方多。请返回最后获胜者的分数。例如:5,2,3,4玩家A先拿,当前他只能拿走5或者4。如果玩家A拿走5,那么剩下2,3,4。轮到玩家B,此时玩家B可以选择2或4中的一个,…如果玩家A拿走4,那么剩下5,2,3。轮到玩家B,此时玩家B可以选择5或3中的一个,…2.思路&code2.1 win1原创 2020-07-01 11:21:41 · 868 阅读 · 0 评论 -
【每日一题-leetcode】122.买卖股票的最佳时机 II
122.买卖股票的最佳时机 II买卖股票的最佳时机 II难度简单702给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例 1:输入: [7,1,5,3,6,4]输出: 7解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。原创 2020-05-20 17:23:12 · 409 阅读 · 0 评论 -
【每日一题-leetcode】121.买卖股票的最佳时机
121.买卖股票的最佳时机买卖股票的最佳时机难度简单952给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。注意:你不能在买入股票前卖出股票。示例 1:输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不能是 7-1 = 6, 因为卖出价格原创 2020-05-20 17:06:03 · 345 阅读 · 0 评论 -
【每日一题-leetcode】152.乘积最大子数组
152.乘积最大子数组乘积最大子数组难度中等580给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。示例 1:输入: [2,3,-2,4]输出: 6解释: 子数组 [2,3] 有最大乘积 6。示例 2:输入: [-2,0,-1]输出: 0解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。dp动态规划:1.找到重复子问题2.dp状态3.dp方程 1.重复子问题 求乘积最大子数组原创 2020-05-19 17:51:29 · 349 阅读 · 0 评论 -
【剑指offer】47.礼物的最大价值
47.礼物的最大价值面试题47. 礼物的最大价值难度中等34在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?示例 1:输入: [ [1,3,1], [1,5,1], [4,2,1]]输出: 12解释: 路径 1→3→5→2→1 可以拿到最多价值的礼物//采用dp 如果是递归的话原创 2020-05-18 21:28:19 · 308 阅读 · 0 评论 -
【每日一题-leetcode】198. 打家劫舍
198. 打家劫舍打家劫舍难度简单786你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。示例 1:输入: [1,2,3,1]输出: 4解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。 偷窃到的最高金额 = 1原创 2020-05-18 16:19:33 · 371 阅读 · 0 评论 -
【剑指offer】49.丑数
49.丑数面试题49. 丑数难度中等26我们把只包含因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。示例:输入: n = 10输出: 12解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。说明:1 是丑数。n 不超过1690。//dp问题 //思路 我们知道丑数是可以被2 or 3 or 5 连续整除的。如果==1 就是丑数// 初始化 dp[0] = 1; 1*2=2 1原创 2020-05-17 17:56:21 · 302 阅读 · 0 评论 -
【每日一题-leetcode】322.零钱对换
322.零钱对换零钱兑换难度中等589给定不同面额的硬币 coins 和一个总金额amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。示例 1:输入: coins = [1, 2, 5], amount = 11输出: 3 解释: 11 = 5 + 5 + 1示例 2:输入: coins = [2], amount = 3输出: -1时间复杂度O(nK)public int coinChange(int[原创 2020-05-17 17:05:35 · 391 阅读 · 0 评论 -
【每日一题-leetcode】1143.最长公共子序列
1143.最长公共子序列最长公共子序列难度中等127给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。一个字符串的 *子序列*是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde”的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。若这两个字符串没有公共子序列,则返回 0。示例 1:原创 2020-05-16 11:12:33 · 386 阅读 · 0 评论 -
【每日一题-leetcode】 62.不同路径
62.不同路径不同路径难度中等523一个机器人位于一个 *m x n *网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?例如,上图是一个7 x 3 的网格。有多少可能的路径?示例 1:输入: m = 3, n = 2输出: 3解释:从左上角开始,总共有 3 条路径可以到达右下角。1. 向右 -> 向右 -> 向下2. 向右 ->原创 2020-05-15 21:32:06 · 389 阅读 · 0 评论 -
【每日一题-leetcode】 120.三角形最小路径和
120.三角形最小路径和三角形最小路径和难度中等387给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。例如,给定三角形:[ [2], [3,4], [6,5,7], [4,1,8,3]]自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。dp//自底向上public int minimumTotal(List<List<Integer>> triangle) { i原创 2020-05-14 16:12:55 · 345 阅读 · 0 评论 -
【每日一题-leetcode】70.爬楼梯
70.爬楼梯爬楼梯难度简单943假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例 1:输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶示例 2:输入: 3输出: 3解释: 有三种方法可以爬到楼顶。1. 1 阶 +...原创 2020-04-20 16:34:27 · 390 阅读 · 0 评论 -
【剑指offer】9.斐波那契数列
9.斐波那契数列写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000...原创 2020-03-30 10:58:35 · 406 阅读 · 0 评论 -
【每日一题-leetcode】70.climbing-stairs
假设你正在爬楼梯。需要 n阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例 1:输入: 2输出: 2解释: 有两种方法可以爬到楼顶。 1 阶 + 1 阶 2 阶 1.暴力破解思路:我们可以将问题简单化,一个2个台阶可以分成是走2步和走1步结果的和。依次调用这个函数。进行细化求解...原创 2020-03-23 10:16:59 · 343 阅读 · 0 评论