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

欢迎关注我的公众号: 清风Python,带你每日学习Python算法刷题的同时,了解更多python小知识。

我的个人博客:https://qingfengpython.cn

力扣解题合集:https://github.com/BreezePython/AlgorithmMarkdown

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值