
动态规划
算法
ZQQ~BK
这个作者很懒,什么都没留下…
展开
-
背包问题
一、01背包问题 01背包的特点是:每种物品仅有一件,可以选择放或不放。 声明一个二维数组dp[V + 1 , N + 1] ,dp[i ][ j] 表示 前j件物品恰放入一个容量恰为v的背包可以获得的最大价值。 1) 当i<weight[j-1] 时, 说明背包容量不足以放下第i件物品,只能选择不拿,此时: dp[i][j]=dp[i][j-1]; 2) 当 i>=weight[j-1]时,这是背包容量可以放下第i件物品,可以选择拿还是不拿,判断标准:拿这件物品是否能获取更大的价值。原创 2020-05-31 22:49:59 · 189 阅读 · 0 评论 -
零钱兑换
题目描述: 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。 class Solution { public int coinChange(int[] coins, int amount) { int[] dp = new int[amount+1]; for(int i=0; i<amount+1; i++) { dp[i原创 2020-05-17 19:21:59 · 124 阅读 · 0 评论 -
最长上升子序列
题目描述: 给定一个无序的整数数组,找到其中最长上升子序列的长度。 思路分析: dp[i]记录i之前最长上升子序列的长度 class Solution { public int lengthOfLIS(int[] nums) { int len=nums.length; if(len<2){ return len; } int[] dp=new int[len+1]; dp[1]=1;原创 2020-05-17 18:32:46 · 100 阅读 · 0 评论 -
硬币
题目描述: 硬币。给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。(结果可能会很大,你需要将结果模上1000000007) class Solution { public int waysToChange(int n) { int[]dp=new int[n+1]; int[] coins=new int[]{1,5,10,25}; dp[0]=1; for(int coin:coins){原创 2020-05-17 17:44:30 · 168 阅读 · 0 评论 -
剪绳子
题目描述: 给你一根长度为 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。 思路分析: 1.状态数组dp[i]表示:数字 i 拆分为至少两个正整数之和的最大乘积。为了方便计算,dp 的长度是 n + 1,值初始化为 1。 2.外层循环从 3 开始遍历,一直原创 2020-05-17 17:15:46 · 123 阅读 · 0 评论 -
飞机座位分配概率
题目描述: 有 n 位乘客即将登机,飞机正好有 n 个座位。第一位乘客的票丢了,他随便选了一个座位坐下。 剩下的乘客将会: 如果他们自己的座位还空着,就坐到自己的座位上, 当他们自己的座位被占用时,随机选择其他座位 第 n 位乘客坐在自己的座位上的概率是多少? 思路分析: 1.第一个乘客正确坐到第一个位置,概率为1/n 2.第一个乘客坐到最后一个位置,那么最后一个人永远也坐对不了位置,0 3.第一个乘客坐到除了第一个和最后一个以外的位置,(n-2)/n*dp[n-1] class Solution {原创 2020-05-17 14:36:12 · 792 阅读 · 0 评论 -
三角形最小路径和
题目描述: 给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。 相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。 思路分析: dp[i][j]代表三角形路径最小,只需要判断出dp[i-1][j]和dp[i-1][j-1]中最小的加上triangle.get(i).get(j) ,边界情况分开分析 class Solution { public int minimumTotal(List<List<Inte原创 2020-05-17 14:02:36 · 120 阅读 · 0 评论 -
买卖股票的最佳时机含手续费
题目描述: 给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。 你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。 返回获得利润的最大值。 思路分析: a代表当天不持有股票。前一天不持股,代表这一天什么都没有做;前一天持股,代表这一天卖出去一股。 b代表当天持有股票。前一天持股,代表这一天什么都没有做;前一天不持股,代表这一天买入了一股。 class Solution原创 2020-05-17 13:10:19 · 207 阅读 · 0 评论 -
不同的二叉搜索树
题目描述: 给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种? 思路分析: 以i为树根的二叉搜索树可以是0,1,2,…,i-1和i+1,i+1,…n,然后可以递归的求解以每一个具体的数为树根的二叉搜索树的个数,相加求和即可 class Solution { public int numTrees(int n) { int[] dp=new int[n+1]; dp[0]=1; dp[1]=1; for(int i=2;原创 2020-05-17 10:58:06 · 124 阅读 · 0 评论 -
最小路径和
题目描述: 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 思路分析: 状态转移方程: dp[i][j]=Math.min(dp[i-1][j],dp[i][j-1])+grid[i-1][j-1]; class Solution { public int minPathSum(int[][] grid) { int rlen=grid.length; int clen=g原创 2020-05-17 10:36:26 · 119 阅读 · 0 评论 -
统计全为 1 的正方形子矩阵
题目描述: 给你一个 m * n 的矩阵,矩阵中的元素不是 0 就是 1,请你统计并返回其中完全由 1 组成的 正方形 子矩阵的个数。 思路分析: dp[i][j]=Math.min(dp[i-1][j],Math.min(dp[i][j-1],dp[i-1][j-1]))+1;可以计算出(i,j)的最大正方形的边长。 class Solution { public int countSquares(int[][] matrix) { int rlen=matrix.length;原创 2020-05-16 23:05:47 · 226 阅读 · 0 评论 -
矩阵区域和
题目描述: 给你一个 m * n 的矩阵 mat 和一个整数 K ,请你返回一个矩阵 answer ,其中每个 answer[i][j] 是所有满足下述条件的元素 mat[r][c] 的和: i - K <= r <= i + K, j - K <= c <= j + K (r, c) 在矩阵内。 思路分析: 1.dp[i][j]存储的是mat[0][0]到mat[i][j]的总和; 2.res存储的是矩阵和,确定矩阵的最左上角位置和右下角位置 3.如图,很轻松算出红色区域的和原创 2020-05-16 22:01:27 · 415 阅读 · 0 评论 -
礼物的最大价值
题目描述: 在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物? 思路分析:一个方格的最大价值礼物只能是从左侧或者上侧选取最大的那个加上本方格的值 class Solution { public int maxValue(int[][] grid) { int rlen=grid.length;原创 2020-05-16 20:35:55 · 215 阅读 · 0 评论 -
比特位计数
题目描述: 给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。 方法一:数学 如果是偶数,它除以2后的二进制数1的个数和它相同 如果是奇数,比它小1的偶数的二进制数1的个数多1 class Solution { public int[] countBits(int num) { int[] dp=new int[num+1]; dp[0]=0; for(int i=1;i原创 2020-05-16 20:01:14 · 186 阅读 · 0 评论 -
打家劫舍
题目描述: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。 class Solution { public int rob(int[] nums) { int a=0; int b=0; int c=0;原创 2020-05-16 18:06:58 · 109 阅读 · 0 评论 -
使用最小花费爬楼梯
题目描述: 数组的每个索引做为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 costi。 每当你爬上一个阶梯你都要花费对应的体力花费值,然后你可以选择继续爬一个阶梯或者爬两个阶梯。 您需要找到达到楼层顶部的最低花费。在开始时,你可以选择从索引为 0 或 1 的元素作为初始阶梯。 class Solution { public int minCostClimbingStairs(int[] cost) { int a=0; int b=0; for原创 2020-05-16 17:47:29 · 159 阅读 · 0 评论 -
判断子序列
题目描述: 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。 示例 1: s = “abc”, t = “ahbgdc” 返回 true. 示例 2: s = “axc”, t = “原创 2020-05-16 17:26:17 · 132 阅读 · 0 评论 -
按摩师
题目描述: 一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。 思路分析: a代表第i-2最长预约时间,b代表第i-1最长预约时间,c代表本次预约最长时间,本次最长时间Math.max(b,a+nums[i]); class Solution { public int massage(int[] nums) { int a=原创 2020-05-16 15:27:39 · 131 阅读 · 0 评论 -
买卖股票的最佳时机
题目描述: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。 注意你不能在买入股票前卖出股票。 思路分析: 数组dp[i][0]用来存储最大利润,dp[i][1]用来存储买股最小价格的负数 通过for循环,dp[len-1][0]就是最大的利润 class Solution { ...原创 2020-03-09 20:26:23 · 207 阅读 · 0 评论 -
连续子数组的最大和
题目描述: 输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。 要求时间复杂度为O(n)。 class Solution { public int maxSubArray(int[] nums) { int len=nums.length; int[] dp=new int[len]; dp[0]=nums[0]; int max=nums[0]; for(int原创 2020-05-16 00:04:19 · 98 阅读 · 0 评论 -
区域和检索 - 数组不可变
题目描述: 给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点。 会多次调用 sumRange 方法。 方法一:进行缓存 class NumArray { private Map<Pair<Integer,Integer>,Integer> map=new HashMap<>(); public NumArray(int[] nums) { for(int i=0;i<原创 2020-05-15 23:44:39 · 103 阅读 · 0 评论 -
除数博弈
题目描述: 爱丽丝和鲍勃一起玩游戏,他们轮流行动。爱丽丝先手开局。 最初,黑板上有一个数字 N 。在每个玩家的回合,玩家需要执行以下操作: 选出任一 x,满足 0 < x < N 且 N % x == 0 。 用 N - x 替换黑板上的数字 N 。 如果玩家无法执行这些操作,就会输掉游戏。 只有在爱丽丝在游戏中取得胜利时才返回 True,否则返回 false。假设两个玩家都以最佳状态参与游戏。 方法一:数学思维 谁先从2的基础减一谁胜,所以只需要判断奇偶数即可 class Solution {原创 2020-05-15 23:02:46 · 97 阅读 · 0 评论