***、题目链接
Day4:Leetcod 2144. 打折购买糖果的最小开销
一、题目
1、题目描述
一家商店正在打折销售糖果。每购买 两个 糖果,商店会 免费 送一个糖果。
免费送的糖果唯一的限制是:它的价格需要小于等于购买的两个糖果价格的 较小值 。
- 比方说,总共有 4 个糖果,价格分别为 1 ,2 ,3 和 4 ,一位顾客买了价格为 2 和 3 的糖果,那么他可以免费获得价格为 1 的糖果,但不能获得价格为 4 的糖果。
给你一个下标从 0 开始的整数数组 cost ,其中 cost[i] 表示第 i 个糖果的价格,请你返回获得 所有 糖果的 最小 总开销。
样例输入:[6,5,7,9,2,2]
;
样例输出:23
。
2、基础框架
- C++给出的代码框架如下:
class Solution {
public:
int minimumCost(vector<int>& cost) {
}
};
二、解题报告
1、思路分析
(
1
)
(1)
(1) 将糖果价格从大到小排序;
(
2
)
(2)
(2) 设置一个计数器,三个一组,将前两个加到总价里,第三个为赠送的糖果。
2、时间复杂度
O ( n l o g n ) O(nlog_n) O(nlogn) ,排序为 l o n g n long_n longn,遍历为 n n n;
3、代码详解
class Solution {
public:
int minimumCost(vector<int>& cost) {
sort(cost.rbegin(), cost.rend());
int sum = 0;
int kase = 0;
for(int num : cost){
kase++;
if(kase == 3){
kase = 0;
continue;
}
sum += num;
}
return sum;
}
};
三、写在最后
要明白从买两个贵的糖果,送一个次贵的糖果是最省钱的购买方式。