1833.雪糕的最大数量 基础排序、栈操作、堆排序 三解so easy!

简介: 1833.雪糕的最大数量 基础排序、栈操作、堆排序 三解so easy!

1833.雪糕的最大数量


https://leetcode-cn.com/problems/maximum-ice-cream-bars/solution/5735xue-gao-de-zui-da-shu-liang-zhe-chon-kt3f/

难度:中等


题目

夏日炎炎,小男孩 Tony 想买一些雪糕消消暑。

商店中新到 n 支雪糕,用长度为 n 的数组 costs 表示雪糕的定价,其中 costs[i] 表示第 i 支雪糕的现金价格。Tony 一共有 coins 现金可以用于消费,他想要买尽可能多的雪糕。

给你价格数组 costs 和现金量 coins ,请你计算并返回 Tony 用 coins 现金能够买到的雪糕的 最大数量 。

注意:Tony 可以按任意顺序购买雪糕。

提示:

  • costs.length == n
  • 1 <= n <= 10 ^ 5
  • 1 <= costs[i] <= 10 ^ 5
  • 1 <= coins <= 10 ^ 8


示例

示例 1:
输入:costs = [1,3,2,4,1], coins = 7
输出:4
解释:Tony 可以买下标为 0、1、2、4 的雪糕,总价为 1 + 3 + 2 + 1 = 7
示例 2:
输入:costs = [10,6,8,7,7,8], coins = 5
输出:0
解释:Tony 没有足够的钱买任何一支雪糕。
示例 3:
输入:costs = [1,6,3,1,2,5], coins = 20
输出:6
解释:Tony 可以买下所有的雪糕,总价为 1 + 6 + 3 + 1 + 2 + 5 = 18 。


分析


搞不懂这种题怎么能算作是中等?思路也太过简单了吧!


简单排序

  1. 首先我们将雪糕花费,按照从大到小的方式排列
  2. 循环雪糕,每次钱币减去当前雪糕的价格
  3. 重复2操作,当钱不足以买雪糕的时候,返回index - 1即可.


栈操作

  1. 首先我们将雪糕花费,按照逆序排列
  2. 然后开始while循环,钱币大于等于栈顶,则出栈,雪糕数+1
  3. 结束while循环后,返回结果即可...


堆排序

  1. 将costs转化为堆
  2. 每次pop堆顶,当钱币小于堆顶时终止操作


解题1.简单排序

class Solution:
    def maxIceCream(self, costs, coins):
        costs.sort()
        ret = 0
        for index, cost in enumerate(costs):
            coins -= cost
            if coins < 0:
                break
            ret += 1
        return ret


解题2.栈操作

class Solution:
    def maxIceCream(self, costs, coins):
        costs.sort(reverse=True)
        num = 0
        while costs and coins >= costs[-1]:
            num += 1
            coins -= costs.pop()
        return num


解题2.堆排序

import heapq
class Solution:
    def maxIceCream(self, costs, coins):
        num = 0
        heapq.heapify(costs)
        while costs:
            coins -= heapq.heappop(costs)
            if coins < 0:
                return num
            num += 1
        return num




相关文章
|
3天前
|
机器学习/深度学习 算法 测试技术
【单调栈】3113. 边界元素是最大值的子数组数目
【单调栈】3113. 边界元素是最大值的子数组数目
|
2天前
|
前端开发 JavaScript 算法
JavaScript 中实现常见数据结构:栈、队列与树
JavaScript 中实现常见数据结构:栈、队列与树
|
3天前
|
存储 NoSQL C语言
数据结构——顺序栈与链式栈的实现-2
数据结构——顺序栈与链式栈的实现
数据结构——顺序栈与链式栈的实现-2
|
3天前
|
存储 C语言
数据结构——顺序栈与链式栈的实现-1
数据结构——顺序栈与链式栈的实现
数据结构——顺序栈与链式栈的实现-1
|
3天前
栈的基本应用
栈的基本应用
12 3
|
3天前
栈与队列理解
栈与队列理解
13 1
|
3天前
|
存储 算法
数据结构与算法 栈与队列
数据结构与算法 栈与队列
12 0
数据结构与算法 栈与队列
|
3天前
|
C++
数据结构(共享栈
数据结构(共享栈
9 0
|
3天前
|
C++
数据结构(顺序栈
数据结构(顺序栈
13 2
|
3天前
|
容器
【栈与队列】栈与队列的相互转换OJ题
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
10 0