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

用哈希表记录每个元素出现的次数,再将得到的value(也就是出现的次数)转换成数组,排序,由大到小遍历,加起来和数组长度进行比较,每遍历一个返回值+1,直到和大于数组长度一半,就跳出循环。

class Solution {
    public int minSetSize(int[] arr) {
    	int num = 0;
    	int res = 0;
    	HashMap<Integer, Integer> map = new HashMap<>();
    	for(int i = 0; i < arr.length; i++) {
    		map.put(arr[i], map.getOrDefault(arr[i], 0) + 1);
    	}
    	Integer[] a = map.values().toArray(new Integer[map.values().size()]);
    	Arrays.sort(a);
    	for(int i = a.length-1; i >= 0; i--) {
    		num += a[i];
    		res++;
    		if(num >= arr.length/2) {
    			break;
    		}
    	}
    	return res;
    }
}

原文地址:https://www.cnblogs.com/Jiewl/p/12670453.html

时间: 2024-10-03 18:53:54

1338.数组大小减半的相关文章

5329数组大小减半

题目:给你一个整数数组 arr.你可以从中选出一个整数集合,并删除这些整数在数组中的每次出现.返回 至少 能删除数组中的一半整数的整数集合的最小大小. 来源:https://leetcode-cn.com/problems/reduce-array-size-to-the-half/ 法一:自己的代码 思路:利用贪心算法,先用defaultdict统计出每个元素出现的次数,再由高到底排序,把出现次数逐个求和,一旦大于等于一半,返回结果 from typing import List from c

一道面试题: 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;