JAVA算法题: 不同整数的最少数目 最优解代码是什么
时间: 2023-08-31 13:24:52 浏览: 148
### 回答1:
以下是一种解法:
```java
public int findLeastNumOfUniqueInts(int[] arr, int k) {
Map<Integer, Integer> map = new HashMap<>();
for (int num : arr) {
map.put(num, map.getOrDefault(num, 0) + 1);
}
PriorityQueue<Integer> pq = new PriorityQueue<>((a, b) -> map.get(a) - map.get(b));
pq.addAll(map.keySet());
while (k > 0 && !pq.isEmpty()) {
k -= map.get(pq.poll());
}
return k >= 0 ? pq.size() : pq.size() + 1;
}
```
这个算法的思路是使用哈希表来记录每个整数出现的次数,然后使用优先队列来按照出现次数从小到大排序,每次弹出出现次数最少的整数,直到 k 用尽或者队列为空。如果 k 用尽之前队列已经空了,那么答案就是原始哈希表中所有不同整数的个数加 1;否则答案就是队列中剩余元素的个数。
### 回答2:
题目要求找出给定数组中不同整数的最少数目。为了解决这个问题,可以使用HashSet数据结构来记录数组中的不同整数。通过遍历数组,将每个元素加入HashSet中,HashSet会自动去重。最后返回HashSet中元素的个数即为不同整数的最少数目。
以下是Java的优化解法:
```java
import java.util.HashSet;
public class DifferentIntegers {
public static int countDifferentIntegers(int[] nums) {
HashSet<Integer> set = new HashSet<>();
for (int num : nums) {
set.add(num);
}
return set.size();
}
public static void main(String[] args) {
int[] nums = {1, 2, 3, 4, 5, 2, 3, 4, 1};
int result = countDifferentIntegers(nums);
System.out.println("不同整数的最少数目:" + result);
}
}
```
以上代码首先创建一个HashSet对象set来保存不同的整数。然后对给定的整数数组进行遍历,将每个元素num加入set中。由于HashSet会自动去重,所以最后返回set对象的size即可得到不同整数的最少数目。
代码中的main函数是测试示例,声明了一个整数数组nums,并调用了countDifferentIntegers函数来计算不同整数的最少数目。最后用println打印结果。
### 回答3:
不同整数的最少数目可以用贪心算法来解决。以下是JAVA的最优解代码:
```java
import java.util.HashSet;
public class Solution {
public int findLeastNumOfUniqueInts(int[] arr, int k) {
// 使用HashSet来记录不同的整数
HashSet<Integer> set = new HashSet<>();
// 统计每个整数的出现次数
int[] count = new int[100001];
for (int num : arr) {
set.add(num);
count[num]++;
}
int uniqueNums = set.size();
// 将出现次数排序
int[] frequency = new int[uniqueNums];
int index = 0;
for (int num : set) {
frequency[index++] = count[num];
}
Arrays.sort(frequency);
// 找到最少的不同整数的数目
int remove = 0;
for (int freq : frequency) {
if (k >= freq) {
k -= freq;
remove++;
} else {
break;
}
}
return uniqueNums - remove;
}
}
```
该代码首先使用 HashSet 来记录数组中的不同整数,并使用一个数组 count 来统计每个整数的出现次数。然后,将出现次数排序,然后依次从小到大判断出现次数是否小于等于 k,如果是,则将该整数从结果中移除。最后,返回结果中剩余不同整数的数量。
阅读全文