扫描线算法计算区间重叠
Contents
题目来源:Marscode。
小C和小U有一个从
0
开始的数组nums
,以及一个非负整数k
。每次操作中,小C可以选择一个尚未选择的下标i
(范围在[0, nums.length - 1]
),然后将nums[i]
替换为[nums[i] - k, nums[i] + k]
之间的任意整数(包含边界)。
在应用任意次数的操作后,返回数组nums
可能达到的最大分数。数组的分数被定义为数组中最多重复的元素个数。注意,每个下标只能被操作一次。
暴力解(超时) O(n²k)
|
|
优化暴力解 O(n²)
|
|
扫描线算法 O(nlogn)
像是在数某个时刻有多少个区间重叠。一条水平线从左向右扫过,每个起点让重叠数+1,每个终点让重叠数-1,过程中的最大重叠数就是答案。
|
|
注:std::sort
对 std::pair
的默认排序规则是:首先比较 first
成员,如果 first
相等,则比较 second
成员。
完整代码:
|
|