• 阿里巴巴找黄金宝箱(II)


    题目描述:

    一贫如洗的樵夫阿里巴巴在去砍柴的路上,无意中发现了强盗集团的藏宝地,藏宝地有编号从0~N的箱子,每个箱子上面贴有箱子中藏有金币的数量。
    从金币数量中选出一个数字集合,并销毁贴有这些数字的每个箱子,如果能销毁一半及以上的箱子,则返回这个数字集合的最小大小。

    输入描述:

    一个数字字串,数字之间使用逗号分隔,例如: 6,6,6,6,3,3,3,1,1,5

    字串中数字的个数为偶数,并且个数>=1,<=100000;每个数字>=1,<=100000;

    输出描述:

    这个数字集合的最小大小,例如:2

    补充说明:

    示例1

    输入:
    1,1,1,1,3,3,3,6,6,8
    
    输出:
    2
    
    说明:
    选择集合 {1,8},销毁后的结果数组为 [3,3,3,6,6],长度为 5,长度为原数组的一半。
    大小为 2 的可行集合还有 {1,3},{1,6},{3,6}。
    选择 {6,8} 集合是不可行的,它销毁后的结果数组为 [1,1,1,1,3,3,3],新数组长度大于原数组的二分之一。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    示例2

    输入:
    2,2,2,2
    
    输出:
    1
    
    • 1
    • 2
    • 3
    • 4
    • 5

    题目解析

    解题思路

    将不同箱子按照数量多少进行降序排序,先取数量多的箱子才能保证取最少的数据集的箱子编号
    ①确定数据存储方式 map 【箱子编号,箱子数量】
    ②对map进行排序,按照value进行降序排序,将value的结果转为Array遍历,如果箱子数大于等于箱子总数的一半,break即可

    java实现

    package com.HW;
    
    import java.util.Arrays;
    import java.util.Comparator;
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * @ClassName : TAlibaba2
     * @Author : kele
     * @Date: 2023/10/22 13:08
     * @Description :
     */
    public class TAlibaba2 {
    
        public static int num;
    
        public static void main(String[] args) {
            handle("1,1,1,1,3,3,3,6,6,8");
        }
    
        public static void handle(String str) {
    
            String[] split = str.split(",");
    
            HashMap<String, Integer> map = new HashMap<>();
    
            for (String s : split) {
                Integer value = map.getOrDefault(s, 0);
                value++;
                map.put(s, value);
            }
    
            int[] ints = map.entrySet().stream().sorted(new Comparator<Map.Entry<String, Integer>>() {
                @Override
                public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
                    return o2.getValue() - o1.getValue();
                }
            }).mapToInt(x -> x.getValue()).toArray();
    
    
            int sum = 0;
            for (int i = 0; i < ints.length; i++) {
                sum += ints[i];
                if (sum >= split.length / 2) {
                    System.out.println(i + 1);
                    break;
                }
            }
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
  • 相关阅读:
    dbImageSDK 高速数字图像处理
    Java · 方法的使用 · 方法重载 · 方法递归
    Mongodb
    finereport开发者需要关注的问题
    Linux学习笔记
    设置 height: auto 却无法触发 transition 动画的解决方案
    【Pandas】数据分组groupby
    机房工程实习报告怎么写2500字
    如何更改SonarQube的JDK版本
    CSDN: ABTest流量分层分桶机制
  • 原文地址:https://blog.csdn.net/qq_38705144/article/details/133972133