动态规划
-Billy
这个作者很懒,什么都没留下…
展开
-
最长回文子串
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。1. 暴力算法 由于回文串的长度可奇可偶,比如"aba"是奇数形式的回文,"abba"就是偶数形式的回文,两种形式的回文都要搜索,对于奇数形式的,我们就从遍历到的位置为中心,向两边进行扩散,对于偶数情况,我们就把当前位置和下一个位置当作偶数行回文的最中间两个字符,然后向两边进行搜索。 s...原创 2019-01-06 16:25:43 · 93 阅读 · 0 评论 -
最低票价
在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行。在接下来的一年里,你要旅行的日子将以一个名为 days 的数组给出。每一项是一个从 1 到 365 的整数。火车票有三种不同的销售方式:一张为期一天的通行证售价为 costs[0] 美元; 一张为期七天的通行证售价为 costs[1] 美元; 一张为期三十天的通行证售价为 costs[2] 美元。通行证允许数天无限制的旅行...原创 2019-02-15 20:00:35 · 304 阅读 · 0 评论 -
区域和检索 - 数组不可变
给定一个整数数组 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说明:你可以假设...原创 2019-02-21 16:41:27 · 115 阅读 · 0 评论 -
下降路径最小和
给定一个方形整数数组 A,我们想要得到通过 A 的下降路径的最小和。下降路径可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列。 public int minFallingPathSum(int[][] A) { int m = A.length; // 行数 int n = A[0].length; // 列数 i...原创 2019-02-08 23:16:09 · 275 阅读 · 0 评论 -
整数分解
给定一个正整数 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、回溯法(对于每...原创 2019-02-21 18:06:39 · 986 阅读 · 0 评论 -
一和零
该题我尝试使用暴力方法来求解,始终测试不通过,而后将代码改为自底向上的动态规划算法,才测试通过。1、暴力算法(测试不通过) 暴力算法有缺陷 public int findMaxForm(String[] strs, int m, int n) { int len = strs.length; int maxSum = 0; // 最大数量 int zero...原创 2019-02-10 20:25:49 · 423 阅读 · 0 评论 -
最长有效括号
给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。示例 1:输入: ")()())"输出: 4 解释: 最长有效括号子串为 "()()" public int longestValidParentheses(String s) { // 先对字符串s进行判断 if (s == null || s.lengt...原创 2019-02-22 15:10:18 · 429 阅读 · 0 评论 -
最长回文子串
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1:输入: "babad"输出: "bab"注意: "aba" 也是一个有效答案。1、暴力法对于每一个子串,判断是否是回文字符串,找出长度最大者即可。 public String longestPalindrome(String s) { /...原创 2019-02-22 16:27:14 · 113 阅读 · 0 评论 -
目标和
给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。返回可以使最终数组和为目标数 S 的所有添加符号的方法数。1、常规思路 对于数组中的每一个数,它的符号只有两种选择,一种是取正,一种是取负,根据这两种策略,计算结果。 int ncount =...原创 2019-02-12 12:10:56 · 1263 阅读 · 1 评论 -
最长的斐波那契子序列的长度
1、暴力法 枚举所有可能的情况,计算每一种斐波那契数列的长度,取最大值。 // 暴力法(不好实施) public int lenLongestFibSubseq(int[] A) { int a, b, aa; int longest = 0; int len = 2; // 当前斐波那契子序列的长度 for (int i=0; i<A.lengt...原创 2019-02-23 19:18:14 · 830 阅读 · 0 评论 -
完全平方数
解题思路:该题目与Coin Change很相似,先找出到n为止的所有的完全平方数,然后暴力法进行搜索。当然,可以继续优化为动态规划。 int[][] memo = null; // 备忘录 public int sovle(int n, int [] squares, int idx) { if (n == 0) // 找到一种组合 return 0; ...原创 2019-03-01 15:28:37 · 1144 阅读 · 0 评论 -
最低票价
int[][] memo = null; // 备忘录 int r(int idx, int[] days, int[] costs, int deadLine) { int a, b, c, min; if (idx == days.length) return 0; // 有效期超过最后一天 if (deadLine >= days[days...原创 2019-03-01 18:48:53 · 309 阅读 · 0 评论 -
租用游艇问题
长江俱乐部在长江设置了n个游艇出租站1,2,…n,游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇。游艇出租站i到游艇出租站j之间的租金为r(i,j),设计一个算法,计算出从出租站1到出租站n所需要的最少租金。解题思路:f(i, n) = min(f(i,j ) +f(j, k) + ..+f(k,n)) 。public class RentYa...原创 2019-02-26 15:43:03 · 386 阅读 · 0 评论 -
丑数
编写一个程序,找出第 n 个丑数。丑数就是只包含质因数 2, 3, 5 的正整数。示例:输入: n = 10输出: 12解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。说明: 1 是丑数。 n 不超过1690。 public int nthUglyNumber(int n) { int[] num = ...原创 2019-01-29 19:25:27 · 101 阅读 · 0 评论 -
最大正方形
在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。示例:输入: 1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0输出: 41、暴力法计算二维矩阵里,每一个 正方形的面积,判断是否只包含1,如果是算出面积,并取面积最大者的值。 public int solve(char[][] matrix, i...原创 2019-01-29 17:58:33 · 515 阅读 · 0 评论 -
不同路径
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者 向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径? 1、设计暴力算法 public int solve(int m, int n) { if (m == 1 || n == 1) return 1;...原创 2019-01-14 16:26:57 · 152 阅读 · 0 评论 -
不同路径II
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径? 网格中的障碍物和空位置分别用 1 和 0 来表示。说明:m 和 n 的值均不超过 100。 1、备忘录法...原创 2019-01-14 18:07:11 · 141 阅读 · 0 评论 -
最大连续子数列和
题目分析:当我们从前向后遍历数组时,对于数组中每一个整数,它只有两种选择:1)加入到之前的subArray;2) 自己另起一个subArray。那什么时候会出现这两种情况呢?如果之前的subArray的总体和大于0的话,我们认为其对后续的结果是有贡献的。这种情况下我们选择将其加入之前的subArray中。如果之前的subArray的总体和为0或者小于0的话,我们认为其对后续的...原创 2019-01-08 21:24:54 · 485 阅读 · 0 评论 -
最大连续子数列积
在一个数组中,找出一个连续的子数组,使得子数组中元素的乘积最大。比如,对于数组[2,3,-2,4],满足要求的子数组[2,3],其乘积为6。题目分析: 这题跟“最大连续子数列和”非常类似,只不过变成了“最大连续子数列积”,所以解决思路也很类似。仅仅有一个小细节需要注意,就是负负得正,两个负数的乘积是正数,因此我们不仅要跟踪最大值,还要跟踪最小值。 public i...原创 2019-01-21 15:27:09 · 746 阅读 · 0 评论 -
打家劫舍
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。 public static int[] result; // 定义一个备忘录 public i...原创 2019-01-24 15:40:58 · 1441 阅读 · 0 评论 -
最长单调递增子序列
找出由n个数字组成的序列的最长单调递增子序列。 // 错误代码(试图找到以某个元素开头的最长递增子序列) public void maxLis(int[] nums) // 1 2 7 6 8 3 4 { int n = nums.length; int c = 0; int len = 1; // 递增子序列长度 int maxLen = 0x80000000; /...原创 2019-01-19 16:56:35 · 541 阅读 · 0 评论 -
单词拆分
设dp[i]为前i个字符是否可以切割。一个字符串S,它的长度为len,如果S能够被“字典集合”(dict)中的单词拼接而成,那么所要满足的条件为: dp[j] && dict.contains(s.substring(j, i)) 如果我们想知道某个子串是否可由dict中的几个单词拼接而成就可以用这样的方式得到结果(满足条件为True, 不满足条件为False...原创 2019-01-24 18:39:57 · 883 阅读 · 0 评论 -
最小路径和
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。 1、备忘录法 int[][] memo = null; // 备忘录 // 暴力算法 public int solve(int m, int n, int[][] grid) { int sum = 0; // 只有...原创 2019-01-14 18:42:33 · 178 阅读 · 0 评论 -
爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。 1、备忘录 public int solve(int n, int[] memo) { // 边界条件 if (n == 1) return 1; if (n == 2) return 2; ...原创 2019-01-14 19:03:31 · 67 阅读 · 0 评论 -
买卖股票的最佳时机
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。注意你不能在买入股票前卖出股票。 // 遍历两次 public int maxProfit01(int[] prices) { int profit = Integer.MIN_VALUE; // 利润 int ...原创 2019-01-21 14:43:42 · 124 阅读 · 0 评论 -
三角形最小路径和
给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。例如,给定三角形:[ [2], [3,4], [6,5,7], [4,1,8,3]]自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。 int[][] memo = null; // 备忘录 // 设计暴力算法 public int s...原创 2019-01-16 20:00:49 · 203 阅读 · 0 评论 -
编辑距离
int[][] memo = null; // 备忘录 int solve(String word1, String word2, int c1, int c2) { int a, b, c ; int n1 = word1.length(); int n2 = word2.length(); if (c1 == n1 && c2 == n2...原创 2019-02-26 17:37:56 · 167 阅读 · 0 评论