摘要:
78、子集 基本思想: 回溯算法 具体实现: 这道题没有if判断递归是否结束 因为这个是每递归一下就加入到结果数组中, 代码: class Solution { List<List<Integer>> result = new ArrayList<>(); LinkedList<Integer> p 阅读全文
摘要:
46、全排列 基本思想: 回溯算法 具体实现: 与组合问题的不同,不在for循环中使用stratindex 因为全排列问题每次都要从头搜索,例如元素1在[1,2]中已经使用过了,但是在[2,1]中还要再使用一次1。 但是路径中出现过的数字,就不要再添加进来了 代码: class Solution { 阅读全文
摘要:
198、打家劫舍 基本思想: 动态规划 具体实现: 1、确认状态 dp[i]=前 i 个房子在满足条件下的能偷窃到的最高金额。 2、状态转移 由于不可以在相邻的房屋闯入,所以在当前位置 i 房屋可盗窃的最大值, 要么就是 i-1 房屋可盗窃的最大值, 要么就是 i-2 房屋可盗窃的最大值加上当前房屋 阅读全文
摘要:
416、分割等和子集 基本思想: 动态规划-01背包--一个商品只能放一次 背包的体积为sum/2 背包要放入的商品(集合里的元素)重量为元素的数值,价值也为元素的数值 背包如果正好装满,说明找到了总和为sum/2的子集 背包中每一个元素是不可重复放入 具体实现: 1、确定dp数组以及下标的含义 0 阅读全文
摘要:
312、戳气球问题 基本思想: 动态规划 具体实现: 1、确认状态 最后一步 dp[i][j]=x,戳破气球i和气球j之间的所有气球(不包括i和j),可以获得的最高分数为x。 设两个虚拟气球,气球0和气球n+1 子问题 最后一个被戳破的气球为k,子问题就是dp[i][k],dp[k][j] 2、状态 阅读全文
摘要:
887、高楼扔鸡蛋 第一种解法:二分搜索+动态规划 具体实现: 1.定义函数dp(k,n) 当前状态下为k个鸡蛋,面对n层楼,返回这个状态下最少的扔鸡蛋次数 2.选择在第i层楼扔,出现两种情况 (1)鸡蛋碎了 ,鸡蛋个数-1,往下面的楼找,dp(k-1,i-1),随着i增大,函数增大,单调递增 (2 阅读全文
摘要:
10、正则表达式 基本思想: 动态规划 具体实现: 1.确认状态: 最后一步 dp[i][j],代表s[0:i]和p[0:j]是否匹配 dp里面的i和j是s和p的长度 子问题 dp[i-1][j-1],dp[i][j-2],dp[i-1][j-2],dp[i-1][j] 2、状态转移公式: 3、初始 阅读全文
摘要:
516、最长回文子序列 基本思想: 动态规划运用二维dp数组 具体实现: 1、确定状态: (1)最后一步 字符串s[i:j]中的最长回文子序列的长度 (2)子问题 2、转移方程 (1)s[i]==s[j] 把字符串左右同时缩小一下+2,上图情况1 +2 (2)s[i]!=s[j] 不相等的话说明这两 阅读全文
摘要:
53、最大子数组问题 基本思想: 动态规划 具体实现: 1、确定状态 (1)最后一步 以nums[i]结尾的“最大子数组和” (2)子问题 以nums[i-1]结尾的“最大子数组和” 知道了nums列表中以每一个数字结尾的最大子数组和,找出其中最大的就可以了 2、转移方程 dp[i]=max(num 阅读全文
摘要:
704、二分查找 基本思想: 如果目标值等于中间元素,则找到目标值。 如果目标值较小,继续在左侧搜索。 如果目标值较大,则继续在右侧搜索。 具体实现: 1、搜索时是在闭区间[left,right],target定义在这个区间内 初始化right的赋值是len(nums)-1,是最后一个元素的索引, 阅读全文