1338:数组大小减半

This commit is contained in:
huangge1199@hotmail.com 2021-07-12 19:49:53 +08:00
parent 41aaf119af
commit 618c0d3bd6
2 changed files with 144 additions and 0 deletions

View File

@ -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<Integer, Integer> 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)
}

View File

@ -0,0 +1,50 @@
<p>给你一个整数数组&nbsp;<code>arr</code>。你可以从中选出一个整数集合,并删除这些整数在数组中的每次出现。</p>
<p>返回&nbsp;<strong>至少</strong>&nbsp;能删除数组中的一半整数的整数集合的最小大小。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre><strong>输入:</strong>arr = [3,3,3,3,5,5,5,2,2,7]
<strong>输出:</strong>2
<strong>解释:</strong>选择 {3,7} 使得结果数组为 [5,5,5,2,2]、长度为 5原数组长度的一半
大小为 2 的可行集合有 {3,5},{3,2},{5,2}。
选择 {2,7} 是不可行的,它的结果数组为 [3,3,3,3,5,5,5],新数组长度大于原数组的二分之一。
</pre>
<p><strong>示例 2</strong></p>
<pre><strong>输入:</strong>arr = [7,7,7,7,7,7]
<strong>输出:</strong>1
<strong>解释:</strong>我们只能选择集合 {7},结果数组为空。
</pre>
<p><strong>示例 3</strong></p>
<pre><strong>输入:</strong>arr = [1,9]
<strong>输出:</strong>1
</pre>
<p><strong>示例 4</strong></p>
<pre><strong>输入:</strong>arr = [1000,1000,3,7]
<strong>输出:</strong>1
</pre>
<p><strong>示例 5</strong></p>
<pre><strong>输入:</strong>arr = [1,2,3,4,5,6,7,8,9,10]
<strong>输出:</strong>5
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= arr.length &lt;= 10^5</code></li>
<li><code>arr.length</code>&nbsp;为偶数</li>
<li><code>1 &lt;= arr[i] &lt;= 10^5</code></li>
</ul>
<div><div>Related Topics</div><div><li>贪心</li><li>数组</li><li>哈希表</li><li>排序</li><li>堆(优先队列)</li></div></div>\n<div><li>👍 24</li><li>👎 0</li></div>