「这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战」
前言
每日一题,轻松解题
每日一题为刷题系列 每日刷一题LeetCode题,并且对题目进行分析,分享思路。
正文
:打折购买糖果的最小开销
难度:简单
题目要求:
一家商店正在打折销售糖果。每购买 两个 糖果,商店会 免费 送一个糖果。
免费送的糖果唯一的限制是:它的价格需要小于等于购买的两个糖果价格的 较小值 。
比方说,总共有 4 个糖果,价格分别为 1 ,2 ,3 和 4 ,一位顾客买了价格为 2 和 3 的糖果,那么他可以免费获得价格为 1 的糖果,但不能获得价格为 4 的糖果。 给你一个下标从 0 开始的整数数组 cost ,其中 cost[i] 表示第 i 个糖果的价格,请你返回获得 所有 糖果的 最小 总开销。
分析题目:
买两颗糖就会送一个糖,这个送的糖价格不能超过你买的其中价格低的那一颗,判断要获得所有糖需要花费多少钱?
举个例子
输入:cost = [1,2,3]
输出:5
解释:我们购买价格为 2 和 3 的糖果,然后免费获得价格为 1 的糖果。
总开销为 2 + 3 = 5 。这是开销最小的 唯一 方案。
注意,我们不能购买价格为 1 和 3 的糖果,并免费获得价格为 2 的糖果。
这是因为免费糖果的价格必须小于等于购买的 2 个糖果价格的较小值。
:解题
方法一
理清思路:
分析:
这么想,要花费最少,那送的一定要是尽可能最贵的,,所以每次都可以获得所有糖果中第三贵的,或者和第二贵相同价格的,因为你买了第一贵的和第二贵的,就会送你一个第三贵的。所以这是最省的方式,所以我们只需要将所有的糖果价格相加,并且遇到三的倍数时跳过就可以了。
编辑代码:
const minCount = arr => {
arr.sort((a, b) => b - a);
let spend = 0;
for (let i = 1; i <= arr.length;; i++) {
if (i % 3 === 0) continue;
spend += arr[i - 1];
}
return spend;
};
- 首先先将数组排序,从大到小
- 然后声明一个变量存放总价格
- 遍历数组,相加两个后跳过一个,直到结束
- 最后返回总价格
总结
无论做什么分析最重要,其中我们分析了题目,分析了解题思路,其实在分析完解题思路后,代码其实就是很简单的事情了,养成习惯,无论做什么之前,都要进行分析,这样有助于你更快更好的完成这件事。