![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
区间问题
abant2
世界上最菜的arcem
展开
-
leetcode 253 会议室 区间问题
此题是很形象的一个题,类似于区间个数,要求不重复的通道数。思路:存每个通道的结束位置,如果和所有会议都冲突了就开新会议室。选择会议室的规则,应该尽量选结束时间晚的。这样可以保证正确。但实际上,选结束时间最早的就行,因为是按第一个数排序的,后面的肯定慢发生,所以不会出现之前考虑的情况。class Solution {public: int minMeetingRooms(vector<vector<int>>& intervals) { pr.原创 2021-07-24 16:35:35 · 361 阅读 · 0 评论 -
leetcode 437 树形前缀和,区间和问题
此题和leetcode 560题极为相似,只不过那个题是线性的,这个是树形的,加了一个回溯。此题就是考虑前缀和历史,每个前缀和都记录下来。如果差值出现,就可以记录总和。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), .原创 2021-07-22 23:45:31 · 100 阅读 · 0 评论 -
leetcode 1915 前缀和历史+状态压缩+异或
这个题一看就属于完全没法做的题,但经过状态压缩后,居然是前缀和历史,醉了。。此题的核心在于建模,如果我们有两个前缀和,能否通过类似减法得到相减后的表示?答案是可以的,定义每个串的状态为10位,1表示这个字母是奇数次,0表示这个字母是偶数次。所以0肯定是满足条件的。如果想合并两个前缀和,只需要用异或即可。这样前面的次数就会被低效。做法:边求前缀和边存历史,和leetcode 560类似。但此题还有一个额外条件,即允许有一个奇数次的。我们只需对每一位进行异或枚举,然后看是否在历史里即可。typedef .原创 2021-07-08 22:19:15 · 208 阅读 · 0 评论 -
leetcode 560 前缀和历史 O(N)解法
这个题一看就是前缀和,但是前缀和加暴力需要O(N2)O(N^2)O(N2)的时间。在此题中,我们求的是子数组的个数,无需考虑构成,所以可以采用一种历史前缀和的形式,不必每次都遍历之前的,可以有效减少重复计算。class Solution {public: int subarraySum(vector<int>& nums, int k) { vector<int> presum{0}; for(auto num: nums)pr.原创 2021-07-08 13:41:46 · 113 阅读 · 0 评论 -
leetcode 1871 动态前缀和,差分,dp,贪心 无敌题目
思路一:对于任意一个位置iii,我们判断它能不能跳到,要看i−maxJumpi-maxJumpi−maxJump和i−minJumpi-minJumpi−minJump区间内是否有1,有的话就可以跳到。这个可以用前缀和来做。但是,问题是我们要看的不是sss数组中的1,而是对dpdpdp数组求前缀和。但我们还没有dpdpdp数组。由于此题只取决于前面的dpdpdp,我们可以直接对dp数组做前缀和。用前缀和时要注意,由于前缀和数组第一个是0,当想取[l,r][l,r][l,r]区间内数时,需要dp[r+1].原创 2021-05-23 22:09:44 · 121 阅读 · 2 评论 -
leetcode 1658 将 x 减到 0 的最小操作数 双指针+前后缀和 全两种做法
这是京东周赛的第三题,没做出来也是不太高兴。这题我一开始想的是dp,其实是个锤子dp。大概我的做法就是右边每去除一个元素,左边都枚举一下,O(N^2)的复杂度,然后就无限超时。。还有种做法是双指针,左边固定,移动右边,满足条件就停或者移动左边,最坏也是N方的复杂度,但好像是能过的。最强的做法是O(N)的,即看到这类连续子序列求和问题,最好是存前缀和的。此题存一个左前缀和和一个右前缀和即可。对每一个左边序列,判断另一个在不在右前缀里。(这不是TwoSum吗。。。。太笨了)class Solution:原创 2020-11-15 14:57:17 · 313 阅读 · 0 评论 -
leetcode 53,152 最大子数组和,最大子数组乘积 相反两次遍历问题
最大子数组和:其实这个问题较为贪心,如果你前面的>0,那你肯定要拿过来用,否则就不用,这个是核心。可以定义dp数组定义为以当前下标结尾的最大和,无需考虑开始元素,因为会贪心的选择。当前面<0时,自然就不用了。class Solution {public: int maxSubArray(vector<int>& nums) { int n = nums.size(); int ans = nums[0]; vect原创 2021-05-18 23:05:36 · 80 阅读 · 0 评论 -
leetcode 1851 离散化考虑事件 堆降维 离线处理
此题用到了离线处理,即不将请求当做在线操作,对请求做预处理后再搞。解法一:multiset+离散化这个题的难点在于,要把开始,结束,以及查询全部转化为事件,左端点加入时,长度加入multiset,右端点加入时,排出对应的长度。需要查询时,看最小长度即可。和1854题类似。typedef tuple<int, int, int> T; //位置,长度,类型class Solution {public: vector<int> minInterval(vector<原创 2021-05-10 22:57:34 · 233 阅读 · 0 评论 -
leetcode 1854 差分,区间离散化
解法一:差分记录开始和结束位置的修改值,后做前缀运算。class Solution {public: int maximumPopulation(vector<vector<int>>& logs) { vector<int> v(102); for(auto log: logs) { v[log[0]-1950]++; v[log[1]-1950]--;原创 2021-05-10 20:46:50 · 249 阅读 · 0 评论 -
leetcode 370 差分数组
此题应用于区间修改问题。如图,标准的区间修改问题。一看就是线段树。但实际是不用的,咱们可以用差分数组来实现这一点。在开始和结束位置记录增加/减少的值,可通过累加得到每个位置的修改值(太强了。。膜拜!!)class Solution {public: vector<int> getModifiedArray(int length, vector<vector<int>>& updates) { vector<int> v(原创 2021-05-10 19:45:17 · 216 阅读 · 0 评论 -
leetcode 57 区间插入问题
输入:一个新区间,以及有序的,无重叠的老区间数组。解法一:合并解法正常来说,把新区间加入,然后排序线性合并,也是56题的思路。这种是完全没有问题的。但是排序实在是太慢,而且本来只需要加入即可,没必要排序。class Solution {public: vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval)原创 2021-05-10 16:40:44 · 53 阅读 · 0 评论 -
leetcode 56 重叠区间合并问题
和重叠区间问题类似,我们先按x排序,这样保证每次下一个都是最先到来的。然后用一个栈存之前没问题的元素,如果有问题就排出合并,和252题的思路基本一致。注:back()是真的好用,爱了。class Solution {public: vector<vector<int>> merge(vector<vector<int>>& intervals) { sort(intervals.begin(), intervals.end原创 2021-05-10 16:15:16 · 114 阅读 · 0 评论 -
leetcode 252 区间重叠问题
问题:给定n个区间,判断是否有重叠。解法:排序,将区间按x,y大小直接排序,这样保证每个区间后面的那个区间都是最早开始的。因此,如果当前区间结束了,最早的区间比结束时间小,那么就说明发生了重叠。class Solution {public: bool canAttendMeetings(vector<vector<int>>& intervals) { sort(intervals.begin(), intervals.end());原创 2021-05-10 16:02:50 · 312 阅读 · 0 评论 -
leetcode 354 LIS变形
这种二维问题一般都是排序+dp,可以转化为LIS问题。解法一:dp状态转移方程为以当前数字结尾的最长序列长度。注意:此题不要用max,不然会超时。class Solution: def maxEnvelopes(self, envelopes: List[List[int]]) -> int: if not envelopes: return 0 arrs = sorted(envelopes, key=lambda x: (x[0], x[1]))原创 2021-03-04 13:35:57 · 96 阅读 · 1 评论