From 618c0d3bd618765c3f32b2a3b22e0c5f6fee4aa9 Mon Sep 17 00:00:00 2001 From: "huangge1199@hotmail.com" Date: Mon, 12 Jul 2021 19:49:53 +0800 Subject: [PATCH] =?UTF-8?q?1338:=E6=95=B0=E7=BB=84=E5=A4=A7=E5=B0=8F?= =?UTF-8?q?=E5=87=8F=E5=8D=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../editor/cn/ReduceArraySizeToTheHalf.java | 94 +++++++++++++++++++ .../editor/cn/ReduceArraySizeToTheHalf.md | 50 ++++++++++ 2 files changed, 144 insertions(+) create mode 100644 src/main/java/leetcode/editor/cn/ReduceArraySizeToTheHalf.java create mode 100644 src/main/java/leetcode/editor/cn/ReduceArraySizeToTheHalf.md diff --git a/src/main/java/leetcode/editor/cn/ReduceArraySizeToTheHalf.java b/src/main/java/leetcode/editor/cn/ReduceArraySizeToTheHalf.java new file mode 100644 index 0000000..2ef2ae6 --- /dev/null +++ b/src/main/java/leetcode/editor/cn/ReduceArraySizeToTheHalf.java @@ -0,0 +1,94 @@ +//给你一个整数数组 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 +// +// Related Topics 贪心 数组 哈希表 排序 堆(优先队列) +// 👍 24 👎 0 + +package leetcode.editor.cn; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +//1338:数组大小减半 +class ReduceArraySizeToTheHalf { + public static void main(String[] args) { + //测试代码 + Solution solution = new ReduceArraySizeToTheHalf().new Solution(); + System.out.println(solution.minSetSize(new int[]{3, 3, 3, 3, 5, 5, 5, 2, 2, 7})); + } + + //力扣代码 + //leetcode submit region begin(Prohibit modification and deletion) + class Solution { + public int minSetSize(int[] arr) { + Map map = new HashMap<>(); + for (int num : arr) { + map.put(num, map.getOrDefault(num, 0) + 1); + } + int[] nums = new int[map.size()]; + int index = 0; + for (int num : map.keySet()) { + nums[index] = map.get(num); + index++; + } + Arrays.sort(nums); + int size = arr.length / 2; + for (int i = nums.length - 1; i >= 0; i--) { + size -= nums[i]; + if (size <= 0) { + return nums.length - i; + } + } + return 0; + } + } +//leetcode submit region end(Prohibit modification and deletion) + +} \ No newline at end of file diff --git a/src/main/java/leetcode/editor/cn/ReduceArraySizeToTheHalf.md b/src/main/java/leetcode/editor/cn/ReduceArraySizeToTheHalf.md new file mode 100644 index 0000000..32a892a --- /dev/null +++ b/src/main/java/leetcode/editor/cn/ReduceArraySizeToTheHalf.md @@ -0,0 +1,50 @@ +

给你一个整数数组 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
+
+ +

 

+ +

提示:

+ + +
Related Topics
  • 贪心
  • 数组
  • 哈希表
  • 排序
  • 堆(优先队列)
  • \n
  • 👍 24
  • 👎 0
  • \ No newline at end of file