首页 > 编程语言 >【贪心算法】力扣1833.雪糕的最大数量

【贪心算法】力扣1833.雪糕的最大数量

时间:2024-07-16 14:28:58浏览次数:14  
标签:1833 int 雪糕 复杂度 coins 力扣 costs 数组

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

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

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

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

你必须使用计数排序解决此问题。

示例 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 。

在这里插入图片描述

方法一:排序 + 贪心

class Solution {
public:
    int maxIceCream(vector<int>& costs, int coins) {
        sort(costs.begin(),costs.end());
        int ans = 0;
        for(int i = 0;i<costs.size();i++){
            if(costs[i] <= coins){
                coins -= costs[i];
                ans++;
            }
            else
            {
                break;
            }         
        }
        return ans;
    }
};

时间复杂度:O(nlogn),其中 n 是数组 costs 的长度。对数组排序的时间复杂度是 O(nlogn),遍历数组的时间复杂度是 O(n),因此总时间复杂度是 O(nlogn)。
空间复杂度:O(logn),其中 n 是数组 costs 的长度。空间复杂度主要取决于排序使用的额外空间。

这个方法应该是通常第一个被想到的,但是需要消耗较多内存在排序上。而且可以发现题目对n和cost等做出了限制,所以可以考虑计数排序的算法。

方法二:技术排序 + 贪心

class Solution {
public:
    int maxIceCream(vector<int>& costs, int coins) {
        vector<int> freq(100001);
        for(int& cost : costs){
            freq[cost]++;
        }
        int count = 0;
        for(int price = 1; price <= 100000; price++){
            if(coins >= price){
                int curCount = min(freq[price],coins / price);
                count += curCount;
                coins -= price * curCount;
            }else{
                break;
            }
        }
        return count;
    }
};

时间复杂度:O(n+C),其中 n 是数组 costs 的长度,C 是数组 costs 中的元素的最大可能值。
空间复杂度:O(C ),其中 C 是数组 costs 中的元素的最大可能值。

初始化freq为一个大小为100001的数组,为什么不设置成100000,原因是数组一般从0开始索引,而我们从1开始储存,所以得给0留一个int的空间。初始化的freq为全部为0的数组,freq的本质是记录每个价格有多少个雪糕。然后开始对costs进行迭代,通过freq记录每个价位的雪糕的数量。之后freq进行迭代,当coins >= price的时候,说明可以买得起这个价位的雪糕,然后用curCount来储存买得起雪糕的数量。最后返回count雪糕数量。

标签:1833,int,雪糕,复杂度,coins,力扣,costs,数组
From: https://blog.csdn.net/sjsjs11/article/details/140465025

相关文章

  • 数据结构(Java):力扣&牛客 二叉树面试OJ题
    目录1、题一:检查两棵树是否相同 1.1思路分析1.2代码2、题二:另一颗树的子树2.1思路分析 2.2代码3、题三:翻转二叉树3.1思路分析3.2代码4、题四:判断树是否对称4.1思路分析 4.2代码 5、题五:判断是否为平衡二叉树5.1思路分析5.1.1平衡二叉树概念5.1.......
  • 力扣第八题——字符串转换整数
    题目介绍请你来实现一个 myAtoi(strings) 函数,使其能将字符串转换成一个32位有符号整数。函数 myAtoi(strings) 的算法如下:空格:读入字符串并丢弃无用的前导空格("")符号:检查下一个字符(假设还未到字符末尾)为 '-' 还是 '+'。如果两者都不存在,则假定结果为正。转换:......
  • 题解:CF1833F Ira and Flamenco
    思路因为要一个长度为\(m\)的,且最大与最小的元素之差小于等于\(m\)所以序列应为\(a_i,a_i+1,a_i+2\dots,a_i+m-1\),所以满足要求的序列之需要连续\(m\)个就行了,这个最开始排序,去重后用lower_bound求一下小于\(a_i+m-1\)的数有没有\(m\)个就行了。考虑满足要求序列的......
  • 【力扣 709】转换成小写字母 C++题解(字符串)
    给你一个字符串s,将该字符串中的大写字母转换成相同的小写字母,返回新的字符串。示例1:输入:s=“Hello”输出:“hello”示例2:输入:s=“here”输出:“here”示例3:输入:s=“LOVELY”输出:“lovely”提示:1<=s.length<=100s由ASCII字符集中的可打印字符组......
  • 【力扣 58】最后一个单词的长度 C++题解(字符串)
    给你一个字符串s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中最后一个单词的长度。单词是指仅由字母组成、不包含任何空格字符的最大子字符串。示例1:输入:s=“HelloWorld”输出:5解释:最后一个单词是“World”,长度为5。示例2:输入:s="flymetot......
  • 力扣-187. 重复的DNA序列
    1.题目题目地址(187.重复的DNA序列-力扣(LeetCode))https://leetcode.cn/problems/repeated-dna-sequences/题目描述DNA序列 由一系列核苷酸组成,缩写为 'A', 'C', 'G' 和 'T'.。例如,"ACGAATTCCG" 是一个DNA序列。在研究DNA时,识别DNA中的重复序列非常有用。......
  • 力扣-81. 搜索旋转排序数组 II
    1.题目题目地址(81.搜索旋转排序数组II-力扣(LeetCode))https://leetcode.cn/problems/search-in-rotated-sorted-array-ii/题目描述已知存在一个按非降序排列的整数数组nums,数组中的值不必互不相同。在传递给函数之前,nums在预先未知的某个下标k(0<=k<nums.length)上......
  • 力扣·33. 搜索旋转排序数组
    1.题目题目地址(33.搜索旋转排序数组-力扣(LeetCode))https://leetcode.cn/problems/search-in-rotated-sorted-array/题目描述整数数组nums按升序排列,数组中的值互不相同。在传递给函数之前,nums在预先未知的某个下标k(0<=k<nums.length)上进行了旋转,使数组变为[n......
  • 力扣-278. 第一个错误的版本
    1.题目题目地址(278.第一个错误的版本-力扣(LeetCode))https://leetcode.cn/problems/first-bad-version/题目描述你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所......
  • 力扣 657. 机器人能否返回原点
    题目内容在二维平面上,有一个机器人从原点 (0,0) 开始。给出它的移动顺序,判断这个机器人在完成移动后是否在 (0,0) 处结束。移动顺序由字符串 moves 表示。字符 move[i] 表示其第 i 次移动。机器人的有效动作有 R(右),L(左),U(上)和 D(下)。如果机器人在完成所有动作后返......