leetcode
leetcode 3001 ~ 3050
最小展台数量

最小展台数量

难度:

标签:

题目描述

English description is not available for the problem. Please switch to Chinese.

代码结果

运行时间: 38 ms, 内存: 16.0 MB


/*
 * 题目思路:
 * 1. 使用Java Stream API来处理需求清单。
 * 2. 对每一天的需求清单进行统计并更新每种展台的最大需求量。
 * 3. 最终累加所有展台的最大需求量,即为最小展台数量。
 */

import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class ExhibitionBoothStream {
    public int minBoothCount(String[] demand) {
        // 创建一个Map来记录每种展台类型的最大需求量
        Map<Character, Integer> boothCount = new HashMap<>();

        Stream.of(demand).forEach(day -> {
            // 临时记录当前天每种展台的需求量
            Map<Character, Integer> dailyCount = day.chars()
                .mapToObj(c -> (char) c)
                .collect(Collectors.toMap(c -> c, c -> 1, Integer::sum));

            // 更新最大需求量
            dailyCount.forEach((booth, count) -> {
                boothCount.put(booth, Math.max(boothCount.getOrDefault(booth, 0), count));
            });
        });

        // 计算所有展台的最大需求量之和
        return boothCount.values().stream().mapToInt(Integer::intValue).sum();
    }

    public static void main(String[] args) {
        ExhibitionBoothStream ebs = new ExhibitionBoothStream();
        String[] demand1 = {"acd", "bed", "accd"};
        String[] demand2 = {"abc", "ab", "ac", "b"};
        System.out.println(ebs.minBoothCount(demand1)); // 输出: 6
        System.out.println(ebs.minBoothCount(demand2)); // 输出: 3
    }
}

解释

方法:

题解的核心思路是使用一个字典来记录所有天中,每种展台类型所需的最大数量。首先遍历每天的需求,对于每天的展台类型,使用集合去重,然后对每个展台类型,计算当天所需的数量,并与字典中已记录的该展台类型的数量对比,更新为较大值。最后,将字典中所有值相加,得到总的最少展台数量。

时间复杂度:

O(n * k^2)

空间复杂度:

O(u)

代码细节讲解

🦆
在算法中,为什么选择使用集合来去重展台类型,而不是直接在字典中更新需求量?
使用集合去重展台类型是为了确保每天的需求中每种展台类型只被计算一次,这样可以避免在字典中进行不必要的多次更新。如果不使用集合去重,每次遇到一个展台类型就需要在字典中更新,这将导致多次不必要的字典操作,尤其是当一天中某个展台类型出现多次时。使用集合可以先确定哪些展台类型是需要的,然后只针对这些展台类型进行一次需求量的计算和字典更新,从而提高效率。
🦆
你是如何确定字典`dict_`中应该更新为最大需求量而不是累计需求量的?
在确定字典中应该更新为最大需求量而不是累计需求量的依据是,问题的目标是找到满足所有天的需求所需要的最小展台数量。每种展台类型的需求量取决于单日需求的最大值,而不是需求的总和。如果使用累计需求量,会造成对展台数量的过度估计,因为不需要同时满足所有天的需求,而只需要满足任何给定一天中的最大需求。因此,只记录每种展台类型出现的最大单日需求量,就足以确保在任何一天都有足够的展台满足需求。
🦆
由于算法涉及到重复计算字符的数量,是否有更高效的方法避免这种重复计算?
为了避免在每天的需求分析中重复计算字符的数量,可以在遍历每天的需求时,首先使用一个局部字典来记录该天中每种展台类型的数量。这样,对于每种类型,只需在局部字典中查找一次,然后与全局字典进行比较和可能的更新。这种方法减少了字符计数的次数,因为每种类型在每天只计算一次,而不是在每次出现时都重新计数。这不仅减少了计算量,也使代码更加清晰和高效。

相关问题