题目来源: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 成员。
完整代码:
| |

