1. 解题思路
这一题思路而言个人觉得还是挺有意思的,因为显然这道题没法直接用greedy的方法进行处理,考察下述两个例子即可:
1,2,3,3,3
1,2,2,2,3
因此,问题就在于如何去想一个方式使得构造方式可以最大化。
而我们处理这个的思路就是将其首先按照相同元素进行聚类,然后找到某一个元素e
,使其满足:
- 严格小于该元素的所有元素的总个数不超过总元素个数的一半;
- 严格小于该元素的所有元素的总个数加上上述元素的个数超过总元素个数的一半;
此时,我们可以将所有元素分成三个部分:
- 小于元素
e
的元素总数,记作a
; - 元素
e
的元素总数,记作b
; - 大于元素
e
的元素总数,记作c
;
此时我们只需要分类讨论即可:
- 如果满足 a + c ≤ b a+c \leq b a+c≤b,那么可以组成的pair的最大数目一定是 a + c a+c a+c
- 如果满足
a
+
c
>
b
a+c > b
a+c>b,那么总可以合理分配元素
e
用作大数和小数的方式,使得所有的数字应消尽消,此时所有的数字最多剩下一个,取决于总元数个数的奇偶性。
2. 代码实现
给出python代码实现如下:
class Solution:
def minLengthAfterRemovals(self, nums: List[int]) -> int:
n = len(nums)
cnt = sorted(Counter(nums).items())
s = 0
for k, v in cnt:
if s + v < n / 2:
s += v
continue
r = n - s - v
if s + r <= v:
return v - s - r
else:
return n % 2
提交代码评测得到:耗时1170ms,占用内存33.8MB。