0
点赞
收藏
分享

微信扫一扫

并发线程特性-可见性和有序性

题目

思路

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),查看当前专栏更新的所有题目。

举报

相关推荐

0 条评论