
动态规划
飘来荡去、、
这个作者很懒,什么都没留下…
展开
-
求不同路径
思路:动态规划重点:问题分解因为只能向右或者向下移动,那么第一行和第一列中的每一格都设为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 · 173 阅读 · 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 · 168 阅读 · 0 评论 -
单词拆分 II
给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。说明:分隔时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。示例 1:输入:s = "catsanddog"wordDict =["cat", "cats", "and", "sand", "dog&qu原创 2018-12-03 16:25:35 · 833 阅读 · 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 · 337 阅读 · 0 评论 -
区域和检索 - 数组不可变
注意需要多次调用sumRange方法,所以不能简单的进行区间遍历求和,动态规划一下,记录一下 每个区间的和,然后根据索引直接求出结果。class NumArray { private int[] sums; public NumArray(int[] nums) { final int length = nums.length; i...原创 2018-12-01 11:23:08 · 250 阅读 · 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 · 189 阅读 · 0 评论 -
单词拆分
动态规划。问题分解:以leetcode为例,判断一个字符串是否可以被分割成一个一个的单词,那么就就可以先判断l和eetcode是否在字典当中,只有前半部分和剩余部分都在字典当中,那么此时字符串才能被分割为单词;如果不在的话那么继续向下扫描,判断le和eetcode分别在字典当中。这里面使用一个辅助数组用来存放当前扫描位置前的判断结果,就是存放l、le等的判断结果,方便下一次判断(记忆搜...原创 2018-11-27 23:35:09 · 554 阅读 · 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 · 933 阅读 · 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 · 190 阅读 · 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 · 324 阅读 · 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 · 197 阅读 · 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 · 227 阅读 · 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 · 265 阅读 · 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 · 173 阅读 · 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 · 226 阅读 · 0 评论 -
乘积最大子序列
最大乘积可以由正数乘正数或者负数乘负数得到,所以在扫描过程中需要记录两个数值,一个最大值(max),一个最小值(min)。如果当前元素大于等于0,那么通过比较max*nums[i]和nums[i]的大小就可以得到到i为止的最大乘积子序列。如果当前元素小于0,通过比较min*nums[i]和nums[i]的大小就可以得到到i为止的最大乘积子序列。所以可以得到状态转移方程为:当n...原创 2019-01-02 12:40:10 · 212 阅读 · 0 评论