贪心策略作为算法中的经典思想,值得多次探讨及深入,豆包将这个问题放在贪心分类里,就顺手点开了,在这个问题中,贪心算法的核心思想可以理解为“每次选取最常见的菜品价格,直到达到最大金额 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使用感想:
豆包有时候会给予你一些与你思路不同的答案,但不失为一种新的选择,可以先顺着豆包的思路去探寻新方式,深刻理解之后回过头再来回想自己的思路也许有不一样的收获,但豆包也不是万能的还是需要注意辨别其思路准确性,这无疑大大提高了我们对题目的理解