青训营X豆包MarsCode 技术训练AI刷题小C点菜问题| 豆包MarsCode AI 刷题

29 阅读3分钟

问题描述

小C来到了一家餐馆,准备点一些菜。

已知该餐馆有 nn 道菜,第 ii 道菜的售价为 wiwi​。

小C准备点一些价格相同的菜,但小C不会点单价超过 mm 的菜。

小C想知道,自己最多可以点多少道菜?


测试样例

样例1:

输入:m = 6, w = [2, 3, 3, 6, 6, 6, 9, 9, 23]
输出:3

样例2:

输入:m = 4, w = [1, 2, 4, 4, 4]
输出:3

样例3:

输入:m = 5, w = [5, 5, 5, 5, 6, 7, 8]
输出:4

解题思路

我们可以使用一个 HashMap 来统计每种价格的菜的数量。这样我们可以快速地知道每种价格的菜有多少道。

算法步骤

  1. 遍历每道菜的价格

    • 如果价格不超过 m,则将该价格对应的计数加1。
  2. 统计数量最多的那一组

    • 遍历 HashMap 中的所有计数,找出最大的计数。

关键点

  • 过滤价格:只统计价格不超过 m 的菜。
  • 统计最大数量:在所有统计的价格中,找出数量最多的那一组。

代码

import java.util.HashMap;

public class Main {
    public static long solution(int m, int[] w) {
        // 创建一个HashMap来统计每种价格的菜的数量
        HashMap<Integer, Integer> priceCountMap = new HashMap<>();

        // 遍历每道菜的价格
        for (int price : w) {
            // 如果价格不超过m,则统计数量
            if (price <= m) {
                // 更新HashMap中的计数
                priceCountMap.put(price, priceCountMap.getOrDefault(price, 0) + 1);
            }
        }

        // 初始化最大数量为0
        int maxCount = 0;

        // 遍历HashMap,找到数量最多的那一组
        for (int count : priceCountMap.values()) {
            // 更新最大数量
            if (count > maxCount) {
                maxCount = count;
            }
        }

        // 返回最大数量
        return maxCount;
    }

    public static void main(String[] args) {
        System.out.println(solution(6, new int[] { 2, 3, 3, 6, 6, 6, 9, 9, 23 }) == 3);
        System.out.println(solution(4, new int[] { 1, 2, 4, 4, 4 }) == 3);
        System.out.println(solution(5, new int[] { 5, 5, 5, 5, 6, 7, 8 }) == 4);
    }
}

优化思路

  1. 减少不必要的遍历

    • 当前代码在遍历 HashMap 时,会遍历所有的键值对,即使某些键值对的数量已经小于当前的最大数量。我们可以通过在遍历过程中及时更新最大数量来减少不必要的比较。
  2. 减少内存使用

    • 如果菜的价格范围不大,可以考虑使用数组来代替 HashMap,这样可以减少内存开销。
  3. 优化数据结构

    • 如果菜的价格范围较大,但数量较少,可以考虑使用 TreeMap 来代替 HashMap,这样可以自动排序,减少后续的排序操作。

优化方向

  1. 减少遍历次数

    • 在遍历 HashMap 时,如果当前计数已经小于最大数量,可以直接跳过后续的比较。
  2. 使用数组代替 HashMap

    • 如果菜的价格范围在 [0, m] 之间,可以使用一个长度为 m+1 的数组来统计每种价格的菜的数量。
  3. 使用 TreeMap 代替 HashMap

    • 如果菜的价格范围较大,但数量较少,可以使用 TreeMap 来自动排序,减少后续的排序操作。