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)

法二:别人代码

思路:同上,学会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)

原文地址:https://www.cnblogs.com/xxswkl/p/12253044.html

时间: 2024-10-06 00:22:12

5329数组大小减半的相关文章

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],新数组长度大于原数组的二分之

一道面试题: C能申请的最大全局数组大小?

一道面试题: C能申请的最大全局数组大小?第一反应好像是4GB,但明显不对,代码和数据都要占空间,肯定到不了4GB.但是又想内存可以和硬盘数据交换,那到底是多少?应该是32位系统是理论上不能超过4GB(因为地址宽度4bytes,寻址的限制),实际中由于OS实现的细节会更少(比如Linux 1GB给了内核),而64位系统不超过2^64-1:内存大小最好大于数组长度,否则导致和磁盘交换数据,性能下降如果是局部变量,分配在栈上,空间会更小,取决于编译器 参考:http://stackoverflow.

1、打印二进制机器码,程序内存分析,大端序小端序,指针数组,数组指针,数组的三种访问方式,typedef,#if-0-#endif,求数组大小,括号表达式

 1.打印二进制机器码(分别表示32位的和64位的) #include <stdio.h> /*按照8位的长度打印一个数值*/ void dis8bit(char val) { int bit = 8; while(bit--) { if(1<<bit&val){ printf("1"); } else { printf("0"); } if(!(bit%4)) printf(" "); } putchar(1

C++ delete []p 数组指针,如何知道该数组大小的

本来只是一时兴起,想动手整整大学学的很渣的C++,可是一段小小的代码缺牵扯出一堆问题来,好有趣. 来看一段代码: void main() { char p[6]; char *buf = new char[4]; strcpy(buf,"012356789");//这里越界不会报错 strcpy(p,"Hello"); //若此处越界立即报错 cout<<p<<endl; cout<<buf<<endl; delete

c++: 获取delete[]中的数组大小

看一个小例子: 1 #include <iostream> 2   3 using namespace std; 4   5 class A { 6 public: 7     A() { cout << "A::A()" << endl; } 8     ~A() { cout << "A::~A()" << endl; } 9 }; 10   11 int main() { 12     A* a =

c++运行时决定数组大小 variable-length array

variable-length array是C99添加的一个特性,即数组的长度可以在运行时(run time)决定,而不是在编译时(compile time).即,定义数组时不一定要使用 const int, 也可以使用变量.函数返回值等. 例如 1 int main(){ 2 int a=5, b=6; 3 int arr1[a]; 4 int arr2[ min(a,b) ]; 5 int arr3[ rand()%10 ]; 6 7 } 这些定义数组的方式都是合法的. 不过,这种声明方式好

下压栈(LIFO) (能动态调整数组大小的实现)

import java.util.*; // 下压栈(LIFO) 能动态调整数组大小的实现 public class ResizeArrayStack<Item> implements Iterable<Item> { @SuppressWarnings("unchecked") private Item[] a=(Item[]) new Object[1]; private int N; public boolean isEmpty() { return N=

定义局部变量数组大小过大报错

如果定义的局部变量数组大小过大,编译器会报错"栈溢出". 数组声明在函数内部,属于局部变量,存放在了栈上,如果数组过大比如a[1000000].那数组占用的内存大小为:1000000*4byte约等于4M.而栈的默认内存空间为1M左右,所以会导致内存溢出解决这个问题.解决这个问题方法为:可以将数组声明在全局存储区或堆上即可 方法一:申明为全局变 方法二:存放在堆上

程序猿之---C语言细节28(const变量初始化、数组大小用const变量细节、const变量与#define宏、volatile修饰)

主要内容:const变量初始化.数组大小用const变量细节.const变量与#define宏.volatile修饰 一.const变量初始化时必须赋值 二.const变量在C++中可以做数组大小元素.在C中不行,因为它是变量 三.const和#define区别:内存分配 四.volatile修饰一些变量:易被操纵系统.硬件.多线程修改的变量 #include <stdio.h> int main() { /* 测试1 */ const int b; // 不初始化会报错 // b = 2;