/*
难度:中等
夏日炎炎,小男孩Tony想买一些雪糕消消暑。
商店中新到n支雪糕,用长度为n的数组costs表示雪糕的定价,其中costs[i]表示第i支雪糕的现金价格。
Tony一共有coins现金可以用于消费,他想要买尽可能多的雪糕。
请计算Tony可以买到的雪糕的最大数量。
Tony可以按任意顺序购买雪糕。示例:
输入:costs=[1,3,2,4,1], coins=7
输出:4示例:
输入:costs=[10,6,8,7,7,8], coins=5
输出:0示例:
输入:costs=[1,6,3,1,2,5], coins=20
输出:6提示:
costs.length == n
1 <= n <= 10^5
1 <= costs[i] <= 10^5
1 <= coins <= 10^8
*/
extension Daily { static func test_leetcode1833() {let cases = [([1,3,2,4,1], 7),([10,6,8,7,7,8], 5),([1,6,3,1,2,5], 20)]for (costs, coins) in cases {//          let res = Daily.leetcode1833(costs: costs, coins: coins)let res = Daily.leetcode1833(costs: costs, coins: coins)
//          print("最终结果 \(res)")}}//1 用map计数后再排序,可以减少重复价格雪糕的排序//还有一种类似的方法: 因为1<=costs[i]<=10^5,所以可以直接统计从1到10^5出现的次数,而不需要用map,效率更高static func leetcode1833(costs: [Int], coins:Int) -> Int {if costs.count < 1 || coins < 1 {return 0}var map: [Int:Int] = [Int:Int]() for acost in costs {map[acost] = (map[acost] ?? 0) + 1}let sorted = map.sorted{ $0.key < $1.key}//       print("sorted: \(sorted)")var sum = 0var total = 0var rest = coinsfor idx in 0..<sorted.count {let key = sorted[idx].keyif rest < key {break}let canby = rest / keylet available = sorted[idx].valueif available > canby {total += canbysum += canby*keybreak}let xcost =  available * keytotal += availablesum += xcostrest -= xcost}
//      print("coins消耗:\(sum), 能买 \(total) 支雪糕 \n")return total}//2 将costs从小到大排序,然后累加并与coins比较;缺点是排序会比较耗时static func leetcode1833_2(costs: [Int], coins:Int) -> Int {if costs.count < 1 || coins < 1 {return 0}let sorted = costs.sorted()
//      print("sorted: \(sorted)")var sum = 0var total = 0for idx in 0..<sorted.count {if sum + sorted[idx] <= coins {sum += sorted[idx]total += 1}else {break}}
//      print("coins消耗:\(sum), 能买 \(total) 支雪糕 \n")return total}//3 动态规划,但是如果map较大,则此方法不适用static func leetcode1833_3(costs: [Int], coins:Int) -> Int {if costs.count < 1 || coins < 1 {return 0}let cols = coins + 1let rows = costs.count + 1var map = Array(repeating: 0, count: rows * cols );for row in 1..<rows {let current = costs[row-1]for col in 1..<cols {let idx = row*cols + collet topidx = idx - colsif current > col  {map[idx] = map[topidx]}else if current == col  {if map[topidx] < 1 {map[idx] = 1}}else {let include = map[row*cols + col - current - cols] + 1if include > map[topidx] {map[idx] = include}}}}showMap(map: map, options: costs, rows: rows, cols: cols)print(" 能买 \(map[rows*cols - 1]) 支雪糕 \n")
//      print("coins消耗:\(sum), 能买 \(total) 支雪糕 \n")return map[rows*cols - 1]}
}

【LeetCode 1833】雪糕的最大数量相关推荐

  1. Leetcode 1833 雪糕的最大数量

    1833. 雪糕的最大数量 难度中等81收藏分享切换为英文接收动态反馈 夏日炎炎,小男孩 Tony 想买一些雪糕消消暑. 商店中新到 n 支雪糕,用长度为 n 的数组 costs 表示雪糕的定价,其中 ...

  2. leetcode 1833. 雪糕的最大数量

    夏日炎炎,小男孩 Tony 想买一些雪糕消消暑. 商店中新到 n 支雪糕,用长度为 n 的数组 costs 表示雪糕的定价,其中 costs[i] 表示第 i 支雪糕的现金价格.Tony 一共有 co ...

  3. LeetCode 1833. 雪糕的最大数量(贪心)

    文章目录 1. 题目 2. 解题 1. 题目 夏日炎炎,小男孩 Tony 想买一些雪糕消消暑. 商店中新到 n 支雪糕,用长度为 n 的数组 costs 表示雪糕的定价,其中 costs[i] 表示第 ...

  4. leetcode 1833 雪糕的最大数量

    夏日炎炎,小男孩 Tony 想买一些雪糕消消暑. 商店中新到 n 支雪糕,用长度为 n 的数组 costs 表示雪糕的定价,其中 costs[i] 表示第 i 支雪糕的现金价格.Tony 一共有 co ...

  5. 力扣(leetcode) 1833. 雪糕的最大数量(快速排序待更新......)

    题目在这:https://leetcode-cn.com/problems/maximum-ice-cream-bars/ 思路分析: 题目比较好理解.我们可以直接使用排序函数对数组进行排序,然后从最 ...

  6. 【Leetcode】1833. 雪糕的最大数量

    Leetcode: 1833. 雪糕的最大数量 题目描述: 解题思路 题目描述: 夏日炎炎,小男孩 Tony 想买一些雪糕消消暑.商店中新到 n 支雪糕,用长度为 n 的数组 costs 表示雪糕的定 ...

  7. LeetCode 每日一题 1833. 雪糕的最大数量

    1833. 雪糕的最大数量 夏日炎炎,小男孩 Tony 想买一些雪糕消消暑. 商店中新到 n 支雪糕,用长度为 n 的数组 costs 表示雪糕的定价,其中 costs[i] 表示第 i 支雪糕的现金 ...

  8. 1833 雪糕的最大数量(排序)

    1. 问题描述: 夏日炎炎,小男孩 Tony 想买一些雪糕消消暑.商店中新到 n 支雪糕,用长度为 n 的数组 costs 表示雪糕的定价,其中 costs[i] 表示第 i 支雪糕的现金价格.Ton ...

  9. python3__leecode/1833.雪糕的最大数量

    1833. maximum ice cream bars 雪糕的最大数量 一.刷题内容 原题链接 内容描述 二.解题方法(贪心算法) 1.方法一:enumerate 2.方法二:while 一.刷题内 ...

  10. leetcode之雪糕的最大数量(C++)

    参考链接 https://leetcode-cn.com/problems/maximum-ice-cream-bars/ 题目描述 夏日炎炎,小男孩 Tony 想买一些雪糕消消暑. 商店中新到 n ...

最新文章

  1. 另类vs2015+xamarin 的android界面乱码 解决
  2. Light OJ 1214 Large Division (大数取模)
  3. Win10计算机首次使用时间,如何查看Win10开机运行了多长时间
  4. SpringBoot——slf4j+logback日志处理及配置详解
  5. js中split,splice,slice方法之间的差异。
  6. MongoDB的增删改查
  7. 这些年,我们无法忘却的jQuery日历插件
  8. ubuntu adduser
  9. 用jquery怎么删除table的一行
  10. SuspendLayout,ResumeLayout,Layout,PerformLayout
  11. libjpeg-turbo 2.1.2 交叉编译
  12. 黑苹果简单驱动 MultiBeast用法基础篇
  13. 国外优秀JAVA技术网站推荐
  14. ls命令显示颜色含义详解
  15. 《2021企业数智化转型升级创新服务企业》榜重磅发布
  16. sqldbx mysql 乱码_使用PLSQL Developer和DbVisualizer、SQLDBx查询oracle数据库时出现乱码...
  17. jQuery - 小鸟系列之DOM操作
  18. 5-6 人生的不同阶段
  19. 微型计算机中的内存主要包括哪两类,微机原理考试资料.doc
  20. 医护管理平台系统服务器,康软智能移动医护管理系统

热门文章

  1. 第1章 蓝牙降噪耳机简述
  2. 构建自己的gym训练环境
  3. 【主题词——蓝色妖姬】
  4. 《数据结构》:中缀表达式合法性判断
  5. 施一公首部作品:《自我突围:向理想前行》
  6. MLE, MAP and LSM
  7. JAVA 命令行运行java项目
  8. oracle-经典图书收集
  9. MATLAB 郭彦甫 第十四课练习答案
  10. Android EventBus-----(EventBus简单使用)