Skip to content

Latest commit

 

History

History
154 lines (123 loc) · 3.38 KB

File metadata and controls

154 lines (123 loc) · 3.38 KB

English Version

题目描述

给你一个整数数组 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},结果数组为空。

 

提示:

  • 1 <= arr.length <= 105
  • arr.length 为偶数
  • 1 <= arr[i] <= 105

解法

哈希表计数,按出现的频率倒序。

Python3

class Solution:
    def minSetSize(self, arr: List[int]) -> int:
        couter = Counter(arr)
        ans = n = 0
        for _, cnt in couter.most_common():
            n += cnt
            ans += 1
            if n * 2 >= len(arr):
                break
        return ans

Java

class Solution {
    public int minSetSize(int[] arr) {
        Map<Integer, Integer> counter = new HashMap<>();
        for (int v : arr) {
            counter.put(v, counter.getOrDefault(v, 0) + 1);
        }
        List<Integer> t = new ArrayList<>();
        for (int cnt : counter.values()) {
            t.add(cnt);
        }
        Collections.sort(t, Collections.reverseOrder());
        int ans = 0;
        int n = 0;
        for (int cnt : t) {
            n += cnt;
            ++ans;
            if (n * 2 >= arr.length) {
                break;
            }
        }
        return ans;
    }
}

C++

class Solution {
public:
    int minSetSize(vector<int>& arr) {
        unordered_map<int, int> counter;
        for (int v : arr) ++counter[v];
        vector<int> t;
        for (auto& [k, v] : counter) t.push_back(v);
        sort(t.begin(), t.end(), greater<int>());
        int ans = 0;
        int n = 0;
        for (int cnt : t) {
            n += cnt;
            ++ans;
            if (n * 2 >= arr.size()) break;
        }
        return ans;
    }
};

Go

func minSetSize(arr []int) int {
	counter := make(map[int]int)
	for _, v := range arr {
		counter[v]++
	}
	var t []int
	for _, v := range counter {
		t = append(t, v)
	}
	sort.Slice(t, func(i, j int) bool {
		return t[i] > t[j]
	})
	ans, n := 0, 0
	for _, cnt := range t {
		n += cnt
		ans++
		if n*2 >= len(arr) {
			break
		}
	}
	return ans
}

...