5329数组大小减半

Posted xxswkl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5329数组大小减半相关的知识,希望对你有一定的参考价值。

题目:给你一个整数数组 arr。你可以从中选出一个整数集合,并删除这些整数在数组中的每次出现。返回 至少 能删除数组中的一半整数的整数集合的最小大小。

来源:https://leetcode-cn.com/problems/reduce-array-size-to-the-half/

法一:自己的代码

思路:利用贪心算法,先用defaultdict统计出每个元素出现的次数,再由高到底排序,把出现次数逐个求和,一旦大于等于一半,返回结果

技术图片
from typing import List
from collections import defaultdict
class Solution:
    def minSetSize(self, arr: List[int]) -> int:
        d = defaultdict(int)
        size = int(len(arr)/2)
        for i in arr:
            d[i] += 1
        ans = 0
        s = 0
        k = sorted(d.values())
        k.reverse()
        for i in k:
            s += i
            ans += 1
            if s >= size:
                return ans
if __name__ == __main__:
    duixiang = Solution()
    # a = duixiang.minSetSize(arr = [3,3,3,3,5,5,5,2,2,7])
    a = duixiang.minSetSize(arr = [1,9])
    print(a)
View Code

法二:别人代码

思路:同上,学会Counter的用法,以及a.sort(reverse=True),还有合理选择while和for,有时用while更优雅。

技术图片
import collections
from typing import List
class Solution:
    def minSetSize(self, arr: List[int]) -> int:
        # key是数组里的元素,values是出现频率
        cnt = collections.Counter(arr)
        print(cnt)
        l = len(arr)
        x = list(cnt.values())
        # 学会这里的写法,实现了由大到小排序
        x.sort(reverse=True)
        ans = 0
        c = 0
        while c < l / 2:
            c += x[ans]
            ans += 1
        return ans
if __name__ == __main__:
    duixiang = Solution()
    a = duixiang.minSetSize(arr = [3,3,3,3,5,5,5,2,2,7])
    # a = duixiang.minSetSize(arr = [1,9])
    print(a)
View Code

 

以上是关于5329数组大小减半的主要内容,如果未能解决你的问题,请参考以下文章

[LeetCode] 1338. Reduce Array Size to The Half 数组大小减半

修剪功能将内存大小减半以删除空格?

将 byte[] 数组转换为长度减半的 short[] 数组

web代码片段

#yyds干货盘点#Leetcode周赛 6022. 将数组和减半的最少操作次数

程序员的算法趣题Q43: 让玻璃杯水量减半