###### tags: `Leetcode` `medium` `hash` `python`
# 1338. Reduce Array Size to The Half
## [題目連結:] https://leetcode.com/problems/reduce-array-size-to-the-half/
## 題目:
You are given an integer array ```arr```. You can choose a set of integers and remove all the occurrences of these integers in the array.
Return the minimum size of the set so that **at least** half of the integers of the array are removed.
**Example 1:**
```
Input: arr = [3,3,3,3,5,5,5,2,2,7]
Output: 2
Explanation: Choosing {3,7} will make the new array [5,5,5,2,2] which has size 5 (i.e equal to half of the size of the old array).
Possible sets of size 2 are {3,5},{3,2},{5,2}.
Choosing set {2,7} is not possible as it will make the new array [3,3,3,3,5,5,5] which has a size greater than half of the size of the old array.
```
**Example 2:**
```
Input: arr = [7,7,7,7,7,7]
Output: 1
Explanation: The only possible set you can choose is {7}. This will make the new array empty.
```
## 解題想法:
* 題目為給一數組,求最少選多少種類的數字移除,可以使得被移除的數字數量最少為數組的一半以上。
* 用hash table:
* dic=defaultdict(int)
* key: 數字
* val: 出現次數
* 將dic 由val大小進行排序:
* nums=sorted(dic.items(),key=lambda x:x[1],reverse=True)
* type(nums)=list
* nums = [(key,val),.....]
* 計算幾組val累加會大於len(arr)//2即可
## Python:
``` python=
from collections import defaultdict
class Solution(object):
def minSetSize(self, arr):
"""
:type arr: List[int]
:rtype: int
"""
dic=defaultdict(int)
for val in arr:
dic[val]+=1
#sort by value :大到小
nums=sorted(dic.items(),key=lambda x:x[1],reverse=True)
# type(nums)=list -> [(key,val)]
half=len(arr)//2
res=0
curSum=0
for key,val in nums:
res+=1
curSum+=val
if curSum>=half:
return res
return res
if __name__=='__main__':
result=Solution()
ans=result.minSetSize(arr = [3,3,3,3,5,5,5,2,2,7])
print(ans) #2
```