LeetCode-力扣-数组大小减半-1388-详解

这里使用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

看到这里,我真想掐死翻译的,这里,首先先讲解一下题目,可能并不是所有人都会读懂题目,接下来给大家分解一下题目表达的思想:

  1. 求出每个数字出现的次数
  2. 删除任意两个数字的组合(包括重复的)不能超过原始数组的一半
  3. 切记,原数组长度一定是偶数!
    废话不多说,上代码!
'''
导入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))
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值