题目
题目链接:https://leetcode-cn.com/problems/reduce-array-size-to-the-half/
题目解析:其实题目还是很简单的,就是将数组中相同的数字当作一个个集合,问删除多少这样的集合可以使得数组的长度变成一半。
1. 先将数组中对应数字的数量计算出来
2. 然后排序,由大到小
3. 判断加多少个相加的时候会大于数组长度的一般
代码
import java.util.Map;
import java.util.Map.Entry;
class Solution {
public int minSetSize(int[] arr) {
//创建答案
int ans=0;
//创建map集合用于存放每个数字对应的数量
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
//循环遍历
for (int i=0;i<arr.length;i++) {
if(!map.containsKey(arr[i])) {
map.put(arr[i], 1);
}else {
map.put(arr[i], map.get(arr[i])+1);
}
}
//创建集合用于存放数字对应的数量
List<Integer> list = new ArrayList<Integer>();
for (Entry<Integer,Integer> e : map.entrySet()) {
list.add(e.getValue() );
}
//进行排序
Collections.sort(list);
System.out.println(list.toString());
int sum = 0;
//循环判断
for (int j=list.size()-1;j>=0;j--) {
if(list.get(j)>=(arr.length/2)) {
return 1;
}
else if(sum>=(arr.length/2)) {
break;
}
else {
sum = sum + list.get(j);
ans++;
}
}
return ans;
}
}
总结
我只是想到这一方法,但是速度是真的慢,所以如果有人可以优化,可以告诉一下我,我实在是太菜了。