这里使用Python对其进行求解
题目:1338. 数组大小减半
-
给你一个整数数组 arr。你可以从中选出一个整数集合,并删除这些整数在数组中的每次出现。
-
返回 至少 能删除数组中的一半整数的整数集合的最小大小。
示例 1:
输入:arr = [3,3,3,3,5,5,5,2,2,7]
输出:2
解释:选择 {3,7} 使得结果数组为 [5,5,5,2,2]、长度为 5(原数组长度的一半)。
大小为 2 的可行集合有 {3,5},{3,2},{5,2}。
选择 {2,7} 是不可行的,它的结果数组为 [3,3,3,3,5,5,5],新数组长度大于原数组的二分之一。
示例 2:
输入:arr = [7,7,7,7,7,7]
输出:1
解释:我们只能选择集合 {7},结果数组为空。
示例 3:
输入:arr = [1,9]
输出:1
示例 4:
输入:arr = [1000,1000,3,7]
输出:1
示例 5:
输入:arr = [1,2,3,4,5,6,7,8,9,10]
输出:5
提示:
1 <= arr.length <= 10^5
arr.length 为偶数
1 <= arr[i] <= 10^5
看到这里,我真想掐死翻译的,这里,首先先讲解一下题目,可能并不是所有人都会读懂题目,接下来给大家分解一下题目表达的思想:
- 求出每个数字出现的次数
- 删除任意两个数字的组合(包括重复的)不能超过原始数组的一半
- 切记,原数组长度一定是偶数!
废话不多说,上代码!
'''
导入Counter,方便统计每个数字出现的频次
'''
from collections import Counter
arr = [3,3,3,3,5,5,5,2,2,7]
def leetcode_1338(arr):
counter = Counter(arr).most_common()
# 这里的counter的结果就是[(3, 4), (5, 3), (2, 2), (7, 1)]
# 题目中说明了,arr一定是个偶数
even = len(arr) // 2
# 定义一个result,作为输出结果,并初始值为0,若满足条件+1
result = 0
# 记录删除的数字的长度,并给定初始值为0
del_total = 0
# 对上面记录的tuple进行遍历
for tuple in counter:
if del_total >= even:
return result
# 满足条件的情况下每次result+1
result += 1
# 把tuple中的第一个数字叠加,比如(3, 4),这里取出4
del_total += tuple[1]
'''
还存在一种情况,
就是数组的值为相同的数字,
比如[7,7,7,7,7,7]这时候进行计算,
取出(7, 6),
第二次判断的时候del_total直接大于3,返回result = 1即可
'''
return result
以下是无注释,完整代码
# !/usr/bin/env python
# -*- coding:utf-8 -*-
'''
@author:ccc-ju
@software:PyCharm
@time:2020/6/26 14:38
@leetcode:1338
'''
from collections import Counter
arr = [3,3,3,3,5,5,5,2,2,7]
def leetcode_1338(arr):
result = 0
del_total = 0
counter = Counter(arr).most_common()
even = len(arr) // 2
for tuple in counter:
if del_total >= even:
return result
result += 1
del_total += tuple[1]
return result
print(leetcode_1338(arr))