03 2023 档案
摘要:题目描述 有n中面值的货币,每种有无限个,问组成m的方案总数? f1-xxx 完全背包求方案数 完全背包裸题 代码 #include <iostream> #include <algorithm> using namespace std; typedef long long LL; const in
阅读全文
摘要:题目描述 书有4种,每种价格不同,每本书可以无限买,问刚好花m块钱的方案数? f1-完全背包 基本分析 完全背包裸题 代码 #include <iostream> #include <cstring> #include <algorithm> using namespace std; const i
阅读全文
摘要:题目描述 给了n个正整数,希望选出若干个,然他们的和是m,求方案数? f1-01背包求恰好为m的方案数 基本分析 恰好为m怎么考虑?定义状态的时候就地成恰好为j 属性怎么修改?+之前的方案数 初始化?f[0] = 1 代码 #include <iostream> #include <algorith
阅读全文
摘要:题目描述 收服小精灵需要两个代价,精灵球和体力值,问满足以上数量限制下的能收服的物品数? f1-01背包+双重花费 基本分析 相比于常规01背包,变化在哪?限制条件是独立的两个维度 最大数量下对应的最小的体力怎么找?满足值相等的条件下,让k尽量的小 代码 #include <iostream> #i
阅读全文
摘要:题目描述 给了一个箱子的总体积是V,同时有n件物品,每件的都有一个体积,问怎么去可以让剩余空间最小? f1-01背包-没有显式给价值 基本分析 剩余空间最小?占用的体积最大 01背包的价值是啥?也是v 代码 #include <iostream> using namespace std; const
阅读全文
摘要:题目描述 给了时间m和n组草药[代价、价值],问m时间内能采到的最大价值? f1-01背包 基本分析 01背包裸题 代码 #include <iostream> #include <algorithm> using namespace std; const int N = 1010; int f[N
阅读全文
摘要:题目描述 给两个数组,求数组的公共最长上升子序列? f1 LCS + LIS + 3重循环 基本分析 状态定义的线索?(1)需要包含两个数组;(2)需要考虑到上升的限制; 状态集合?f[i][j]表示a中以前i,b中前j,且以b[j]结尾的最长公共上升子串集合; 状态属性?集合中子序列长度的最大值
阅读全文
摘要:题目描述 求数组中最少去掉多少个元素,可以让剩下的队形保持为^的形状? f1-计算数组+枚举峰值+计算最小出列值 基本分析 是登山的简单变形 代码 #include <iostream> #include <cstring> #include <algorithm> using namespace
阅读全文
摘要:题目描述 给一个数组,求满足^形状的最长长度。 f1-预处理数组+枚举峰值点 基本分析 每一个点都可能是峰值点,需要每次都计算2次最长上升子序列吗?不需要,全部计算完再枚举 怎么转化i到n-1的最长下降子序列?从n-1到i的最长上升子序列 代码 #include <iostream> #includ
阅读全文
摘要:题目描述 给一个正整数数组,可以选起点和方向,问最长的严格下降子序列的长度? f1-求两次最长上升子序列 基本分析 可以选方向怎么考虑?枚举左或者右 可以选起点怎么考虑?枚举i。向左滑翔,从0到i的最长上升子序列长度;向右滑翔:从n-1到i的最长上升子序列长度 代码 #include <cstrin
阅读全文
摘要:题目描述 从数组中找一个连续子数字,对子数组升序的时候,数组就是升序的。 求最短的子数组的长度? f1排序+双指针 基本分析 如果排序后怎么找?左边第一个不等的点和右边第一个不等的点 代码 class Solution: def findUnsortedSubarray(self, nums: Li
阅读全文
摘要:题目描述 给一个数组nums,数组是循环的,求每个元素的下一个元素 f1-xxx 基本分析 循环数组的情况怎么考虑?拉直或者下标取余数 剩下怎么解决?常见的单调递减栈 代码 左到右 class Solution: def nextGreaterElements(self, nums: List[in
阅读全文
摘要:题目描述 nums2中元素都不同,num1是nums2的一个子集。 需要找出nums2中每个元素下一个更大的元素,在映射回nums1中? f1-哈希表+左到右的单调栈 基本分析 向右找最近的更大的值,维护递增栈还是递减的栈,是严格的吗?需要维护非严格递减的栈,例如43342,33都会入栈。 找到的逻
阅读全文
摘要:题目描述 给了一个字符串百奥是的非负整数num和整数k,问怎么移除其中的k个数字,让剩下的数字最小? f1-单调栈 基本分析 怎样的数字是最小的?单调递增排序的 带有约束k怎么考虑?只要栈非空+栈顶>d+ 还有k就能一直删 k没用完怎么办?字符是单调增的,从后往前删k次(k被维护过) 结果怎么得到?
阅读全文
摘要:题目描述 给了两个数组nums1和nums2,数组内元素由0-9构成,需要从两个数组中选出k个数字,并且每个数组中值数字的相对位置不能变,怎样才能组成的值最大? f1 单调栈 基本分析 能感觉到对每个数组需要维护一个递减栈,这是是两个数组的问题,怎么处理?每个数组维护一个 怎么能保证两个数组子序列合
阅读全文
摘要:题目描述 给了一个字符串s,需要删除重复的字符。 要求是(1)每个字母只保留一次;(2)结果的字典序最小 f1-贪心+单调栈 基本分析 如果给定一个s,只能删除一个,怎么删可以使字典序最小?从左到右删除第一个s[i]>s[i+1]的值,比如456651,删除第二个6;987,删除9。 结合上面的思路
阅读全文
摘要:题目描述 给了只包含0和1的矩阵,问只包含1的最大矩形的面积? f1-转化为逐列求面积+单调栈 基本分析 怎么优化暴力枚举的想法?对每一行,可以与处理出包括自己的左边最长的1的个数,写在left矩阵中 逐列的考虑以上数组,就是n个lc_84对应的问题,找以i列为第i列为底的最大矩形面积 代码 以列为
阅读全文
摘要:题目描述 给了一个数组表示柱子的高度,柱子的宽度是1,问能勾勒出的矩形的最大面积? f1-单调栈 基本分析 可能的最大矩形面积是咋算的?对某个位置i的高度h[i]来说,最大面积是向左找到最近的比他低的高度l[i], 向右找到最近的比他低的高度r[i], 宽度是r[i] - l[i]- 1 什么结构可
阅读全文
摘要:题目描述 柱子的宽度是1,高度存在数组中,问如果按照此排列,下雨后能接多少雨水 f1-单调栈 基本分析 要计算能存雨量,需要左边界的高度>=当前标高,需要用什么结构来维护?结构是单调的 又由于可能当前标高是逐渐递增考虑的,不是只计算一次,结构需要从右边添加或者右边弹出?栈 用单调栈怎么模拟计算的过程
阅读全文
摘要:题目描述 有n任务,有m工人,有p药丸,问最多能完成多少个任务? f1 二分+二分 基本分析 总的来说为啥是二分做?最多能完成的任务具有二段性,剩下需要处理的就是写check函数,看check(x)是不是成立 怎么是一个好的安排任务的策略?假设需要处理x个任务,那么选的人肯定是最强的ws[m- x:
阅读全文
摘要:题目描述 每次可以最多跳k步,最终落点是n-1。得分定义为路径上的nums[i]之和,问最大得分? f1-动态规划+单调队列 基本分析 怎么跳可以取到最大?考虑跳到j点的最大值是f[j], 必须从满足j-i<=k的点i转移过来,问题就是在满足要求的区间内,怎么取到最大的f[i]?单调队列 队头舍去什
阅读全文
摘要:题目描述 数组points在x轴上是严格单调增,需要求一个不等式x1 + y2 + x2 - x1的最大值?要求是x2-x1不能超过k f1-分析不等式+单调队列 基本分析 怎么能让值最大?对当前x2和y2来说,在满足x2-x1<=k的区间,需要有y1-x1最大 怎么维护以上最大值?单调队列 代码
阅读全文
摘要:题目描述 数组是整数数组,需要找最长的连续子数组长度。要求是子数组内的最大值-最小值<=limit f1- 双指针+单调队列 基本分析 求最长连续子数组长度考虑什么框架?双指针 怎么维护区间内的最大值和最小值?定义两个单调队列,分别维护最大值和最小值 双指针怎么移动?r每次向右移动一个,这个时候判断
阅读全文
摘要:题目描述 数组值可以是负,需要返回一个非空的子序列和的最大值。其中对子序列的要求是相邻两个元素的原始下标不能超过k f1- dp+单调队列优化 基本分析 1.怎么联想到dp?对某个i来说,不考虑之前的,那么就是num[i], 考虑之前的就是需要在i-k到i-1之间找一个最大的f[j]值,f[i] =
阅读全文
摘要:题目描述 数组是环形数组,且含有负数,求一个子数组,具有最大和 f1-单调队列 基本分析 怎么处理环?破环成链,将n的环展开成2*n的链,在不超过n的窗口内遍历 之后怎么做?在2*n的数组上计算长度不超过n的子数组的最大和,用单调队列就行 为啥弹出的条件是i-q[0] > n , 等于不行?当前遍历
阅读全文
摘要:题目描述 数组含有负数,求一个最短子数组,子数组的和>=k f1-单调队列 基本分析 子数组和的问题怎么优化?前缀和 相比于暴力去枚举,可以有哪两个思路优化?用一个数据结构来存可能的前缀,(1)过河拆桥,如果一个前缀值满足了条件,那么他不用再考虑了,从前面弹出;(2)后浪更迭,当前遍历到的值<= 尾
阅读全文
摘要:题目描述 滑动窗口的长度是k,每次右移一位,需要返回窗口中的最大值 f1-单调队列 基本分析 维护值还是索引?索引可以判断队头是否离开,是更好的选择 0-k-1的窗口怎么维护?只是执行while弹出队尾+追加i的操作,不考虑删除队头 k-n-1的遍历中注意什么?队尾中弹出<nums[i]的索引;追加
阅读全文