03 2021 档案
摘要: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,是最后一个元素的索引,
阅读全文
摘要:300、最长递增子序列 第一种方法 基本思想: 动态规划 具体实现: 1、确定状态 (1)最后一步 以nums[i]这个数结尾的最长递增子序列的长度,设为dp[i] (2)化为子问题 比nums[i]小的之前的nums为结尾的最长递增子序列的长度 2、转移方程 dp[i] = max(dp[i],
阅读全文
摘要:509、斐波那契数列 基本思想: 动态规划,滚动数组思想 具体实现: 动态递归五部: 1.确定dp数组以及下标的含义 dp[i]的定义为:第i个数的斐波那契数值是dp[i] 2.确定递推公式 状态转移方程dp[i] = dp[i - 1] + dp[i - 2] 3.dp数组如何初始化 dp[0]
阅读全文
摘要:206、反转链表 基本思想: 双指针迭代 具体实现: 1、申请两个指针,一个叫pre,一个叫cur cur代表的是当前节点,pre是cur的前一个节点 刚开始,pre指向null,cur是第一个节点 然后cur和pre共同往后走, cur每走完一步就要指向pre cur变成none了,就迭代完了 2
阅读全文
摘要:234、判断是否是回文链表 一、递归法,空间复杂度太大,不采用, 但是要会递归是如何进行的,恶心死我了 https://leetcode-cn.com/problems/palindrome-linked-list/solution/hui-wen-lian-biao-by-leetcode-sol
阅读全文
摘要:239、滑动窗口最大值 基本思想: 需要实现一个队列,这个队列中放入窗口里的元素, 随着窗口的移动,队列也一进一出, 每次移动之后,队列头显示里面的最大值 具体实现: 1.单调队列(递增或递减) 队列中列表中的元素永远是单调递减的,第一个值永远是最大的, 进来一个比第一个值还大的值以后 就把新进来的
阅读全文
摘要:496.下一个最大元素I 基本思想: 先对num1中每一个元素他的下一个最大元素对应的写成个字典, 再将num2中每一个元素在字典中找到对应的value放到一个列表中 具体实现: stack是栈 stack[-1]是列表中最后一个元素 stack.pop()弹出的是最后一个元素 出栈 stack.a
阅读全文
摘要:146.LRU缓存机制 基本思想: 需要做到两点: 1. 快读找到某个key是否有对应的val。(用字典) 2. 要支持在任意的位置快速插入和删除元素。(用链表) 结合起来就是哈希链表 使用双向链表和哈希表结合 为什么使用双向链表? 具体实现: 规定越靠近头部是最新的元素,越靠近尾部是越旧的元素 代
阅读全文