贪心策略 | 豆包MarsCode AI刷题

140 阅读2分钟

贪心策略作为算法中的经典思想,值得多次探讨及深入,豆包将这个问题放在贪心分类里,就顺手点开了,在这个问题中,贪心算法的核心思想可以理解为“每次选取最常见的菜品价格,直到达到最大金额 m 为止”,但实际情况中这题不太符合传统的贪心问题场景,因为它涉及到计算频率和找到最频繁的值,而不是优化某个局部选择。不过主要是为了贪心算法来的,就拿贪心写了。

问题描述

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

已知该餐馆有 n 道菜,第 i 道菜的售价为 wi​。

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

小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

步骤1:排序

如果使用贪心来写,我们需要遍历并且找到频率最高的值,所以优先进行一次升序排序,来过滤掉超过m的值 并定义一些需要的值

    // 先对数组进行排序 
    Arrays.sort(w);
    
    // 初始化最大频率为0 
    int maxCount = 0; 
    int currentCount = 0; 
    int lastPrice = -1;

步骤2:开始遍历寻找

    //遍历排序后的数组
    for(int price :w){
        //如果价格大于m就退出循环
        if(price > m){
            break;
        }
        //如果价格等于上一次就将记录数加1
        if(price == lastPrice){
            currentCount++;
        }
        //否则就比较最大记录数,以及重新更新现记录数
        else{
            maxCount = Math.max(maxCount,currentCount);
            currentCount++;
        }
        //更新当前价格
        lastPrice = price;
    }
    //循环结束更新最大频率
    maxCount = Math.max(maxCount,currentCount);
    return maxCount;

上面就是一个非常简单的循环遍历寻找最大频率数,虽然题目本身并不完全适合用贪心算法直接求解,但通过排序来简化过程,实际上相当于一种贪心的频率选择。 这道题贪心并不是最合适的解法,使用哈希才是最高效的解法,既实现时间复杂度上的优化也实现空间复杂度的优化。

豆包AI使用感想:

豆包有时候会给予你一些与你思路不同的答案,但不失为一种新的选择,可以先顺着豆包的思路去探寻新方式,深刻理解之后回过头再来回想自己的思路也许有不一样的收获,但豆包也不是万能的还是需要注意辨别其思路准确性,这无疑大大提高了我们对题目的理解