题目
思路
while(l<r)
if checked(mid):
r=mid
else
r=mid+1
return l
题解
package hwod;
import java.util.*;
public class FindGoldBox2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String[] inputs = sc.nextLine().split(",");
int[] boxs = Arrays.stream(inputs).mapToInt(Integer::parseInt).toArray();
System.out.println(findGoldBox(boxs));
}
private static Map<Integer, Integer> map = new HashMap<>();
private static int findGoldBox(int[] boxs) {
int nums = boxs.length;
for (int i = 0; i < nums; i++) {
map.put(boxs[i], map.getOrDefault(boxs[i], 0) + 1);
}
int left = 1, right = map.size();
while (left < right) {
int mid = left + right >> 1;
if (checked(mid, nums)) {
right = mid;
} else {
left = mid + 1;
}
}
return left;
}
private static boolean checked(int mid, int nums) {
List<Integer> list = new ArrayList<>(map.values());
list.sort((o1, o2) -> o2 - o1);
int cnt = 0;
for (int i = 0; i < mid; i++) {
cnt += list.get(i);
}
return cnt>=(nums+1)/2;
}
}
推荐
如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。