
动态规划
飘来荡去、、
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
求不同路径
思路:动态规划 重点:问题分解 因为只能向右或者向下移动,那么第一行和第一列中的每一格都设为1,其余格的值都等于M【i,j】 = M【i-1,j】+M【i,j-1】 代码: public int uniquePaths(int m, int n) { int[][] M = new int[m][n]; for(int i = 0; i < ...原创 2019-03-15 21:22:50 · 187 阅读 · 0 评论 -
三角形最小路径和
动态规划,最后路径和最小,那么每一步必须最小 一、求解 求出到达最后一层的所有最小路径,然后再求出其中最小的即可。 初始化二维数组用来存放结果 final int size = triangle.get(triangle.size() - 1).size(); int[][] result = new int[size][size]; result[0][0] = triang...原创 2018-12-13 15:17:57 · 181 阅读 · 0 评论 -
单词拆分 II
给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。 说明: 分隔时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。 示例 1: 输入: s = "catsanddog" wordDict =["cat", "cats", "and", "sand", "dog&qu原创 2018-12-03 16:25:35 · 849 阅读 · 0 评论 -
二维区域和检索 - 矩阵不可变
思路和一维的一样: 首先计算result,求出每一行的所有区间和。 然后累加【row1,row2】区间内每一行的和。 class NumMatrix { private int[][] result; public NumMatrix(int[][] matrix) { int row = matrix.length; if(row ...原创 2018-12-01 23:10:32 · 353 阅读 · 0 评论 -
区域和检索 - 数组不可变
注意需要多次调用sumRange方法,所以不能简单的进行区间遍历求和,动态规划一下,记录一下 每个区间的和,然后根据索引直接求出结果。 class NumArray { private int[] sums; public NumArray(int[] nums) { final int length = nums.length; i...原创 2018-12-01 11:23:08 · 268 阅读 · 0 评论 -
打家劫舍 II
在Ⅰ的基础上进行修改,这里面要额外考虑的就是是否偷窃第一个房间和偷窃最后一个房间,所以就分别计算一下两种情况的值,然后取最大值就可以了。 偷窃第一个房间: int[] result2 = new int[length]; result2[0] = nums[0]; result2[1] = Math.max(nums[0],nums[1])...原创 2018-11-28 15:35:36 · 213 阅读 · 0 评论 -
单词拆分
动态规划。 问题分解: 以leetcode为例,判断一个字符串是否可以被分割成一个一个的单词,那么就就可以先判断l和eetcode是否在字典当中,只有前半部分和剩余部分都在字典当中,那么此时字符串才能被分割为单词;如果不在的话那么继续向下扫描,判断le和eetcode分别在字典当中。这里面使用一个辅助数组用来存放当前扫描位置前的判断结果,就是存放l、le等的判断结果,方便下一次判断(记忆搜...原创 2018-11-27 23:35:09 · 574 阅读 · 0 评论 -
0-1背包、完全背包、多重背包、零钱兑换
目录 一、0-1背包问题 1.1 问题描述 1.2 动态规划过程 1.3 状态转移方程 1.4 填表 1.5 代码 1.6 回溯法求解 1.7 优化 二、完全背包问题 2.1 问题描述 2.2 分析 2.3 填表 2.4 代码 2.5 回溯法求解 2.6 优化 三、多重背包 3.1 问题描述 3.2 分析 3.3 填表 3.4 代码 3.5 回溯法求解 ...原创 2018-12-04 23:25:14 · 998 阅读 · 0 评论 -
打家劫舍
方法一:暴力法 计算到达每一个房间时所能盗窃的最大金额。 设当前为第i个房间,那么可以从【0,i-2】中任意一个房间直接到达第i个房间,所以需要在这里面找到最大值。 class Solution { public int rob(int[] nums) { int length = nums.length; if (length == 0){ ...原创 2018-11-25 19:37:57 · 202 阅读 · 0 评论 -
买卖股票的最佳时机
方法一:暴力破解 public int maxProfit(int[] prices) { int result = Integer.MIN_VALUE; for (int i = 0; i < prices.length; i++){ for (int j = i+1; j < prices.length; j+...原创 2019-03-21 22:53:38 · 331 阅读 · 0 评论 -
使用最小花费爬楼梯
动态规划问题,在爬楼梯的基础上增加了权值,所以这里面计算的最小路径,而不是路径的条数,整体思路还是一样。 设楼梯的阶数为n,也就是cost的长度,T用来保存到达每一阶台阶的花费,那么从1~n-1阶的范围内,可以得出状态转移方程: T[i] = MIN(cost[i] + T[i - 1], cost[i] + T[i - 2]) 当到达第n阶的时候就需要分情况讨论了: 从倒数第二个台...原创 2018-11-23 11:15:35 · 214 阅读 · 0 评论 -
不同路径(二)
在一的基础上增加了障碍: 思路一样,状态转移方程不变,但是要改变转移的条件。 为了便于计算,障碍物赋值-1 情况一:边界处理 当边界中含有障碍物时,那么障碍物以后的位置都要赋值-1,不可达。 情况二:中间 当不在边界上时,计算经过每一个位置的路径M【i】【j】时,需要注意,当M【i-1】【j】和M【i】【j-1】都不为-1的时,它两的和才赋值给M【i】【j】;只要它两中有一个为-1...原创 2019-03-15 21:23:58 · 259 阅读 · 0 评论 -
最长回文字串
给定一个字符串s,找到s中最长的回文子串。你可以假设s的最大长度为1000。 动态规划 代码: //动态规划 public static String longestPalindrome(String s) { final int length = s.length(); int maxLength = 0; i...原创 2019-03-21 21:58:31 · 278 阅读 · 0 评论 -
最大子序和
设sum[i]为以第i个元素结尾且和最大的连续子数组。假设对于第i个元素,所有以它前面的和已经求得,那么以第i个元素结尾且和最大的连续子数组实际上可以分为两种情况: 以第i-1个元素结尾且和最大的连续子数组加上第i个元素 只包含第i个元素 状态转移方程为:。 可以通过判断sum[i-1] + nums[i]是否大于nums[i]来做选择,而这实际上等价于判断sum[i-1]是否大于0。 ...原创 2019-01-02 11:08:12 · 186 阅读 · 0 评论 -
爬楼梯
思路: 爬到n阶的方法有两种: 1. 从n-1阶爬上来 2. 从n-2阶直接上来 同理到达n-1阶的方法也有两种:从n-2阶上或者从n-3阶上,到达n-2阶的方法也有两种:从n-3阶上或者从n-4阶上……………… 递归问题,要想求到达n阶的方法数,必须求到达n-1阶和n-2阶的方法数。得到递归方程:f(n)=f(n-1)+f(n-2) 那么初始状态为:f(1) = 1,f(2...原创 2019-03-15 21:34:11 · 248 阅读 · 0 评论 -
乘积最大子序列
最大乘积可以由正数乘正数或者负数乘负数得到,所以在扫描过程中需要记录两个数值,一个最大值(max),一个最小值(min)。 如果当前元素大于等于0,那么通过比较max*nums[i]和nums[i]的大小就可以得到到i为止的最大乘积子序列。 如果当前元素小于0,通过比较min*nums[i]和nums[i]的大小就可以得到到i为止的最大乘积子序列。 所以可以得到状态转移方程为: 当n...原创 2019-01-02 12:40:10 · 239 阅读 · 0 评论