LeetCode之换酒问题(一千五百一十八)

举报
liuzhen007 发表于 2021/05/26 18:33:49 2021/05/26
【摘要】 目录   题目 解题 方法一、暴力法 方法二、数学法 题目 (原题链接:https://leetcode-cn.com/problems/water-bottles/) 小区便利店正在促销,用 numExchange 个空酒瓶可以兑换一瓶新酒。你购入了 numBottles 瓶酒。 如果喝掉了酒瓶中的酒,那么酒瓶就会变成空的。 请你计算 最多 ...

目录

 

题目

解题

方法一、暴力法

方法二、数学法


题目

(原题链接:https://leetcode-cn.com/problems/water-bottles/

小区便利店正在促销,用 numExchange 个空酒瓶可以兑换一瓶新酒。你购入了 numBottles 瓶酒。

如果喝掉了酒瓶中的酒,那么酒瓶就会变成空的。

请你计算 最多 能喝到多少瓶酒。

示例 1:

输入:numBottles = 9, numExchange = 3
输出:13
解释:你可以用 3 个空酒瓶兑换 1 瓶酒。
所以最多能喝到 9 + 3 + 1 = 13 瓶酒。

示例 2:

输入:numBottles = 15, numExchange = 4
输出:19
解释:你可以用 4 个空酒瓶兑换 1 瓶酒。
所以最多能喝到 15 + 3 + 1 = 19 瓶酒。

提示:

  • 1 <= numBottles <= 100
  • 2 <= numExchange <= 100

解题

方法一、暴力法

分析:直接模拟整个兑换过程,非常简单,看代码吧。

代码:(C++)


  
  1. class Solution {
  2. public:
  3. int numWaterBottles(int numBottles, int numExchange) {
  4. int bottle = numBottles;
  5. int res = numBottles;
  6. while (bottle >= numExchange) { // 说明还可以兑换
  7. bottle -= numExchange;// 每次兑换一个
  8. res++;
  9. bottle++;
  10. }
  11. return res;
  12. }
  13. };

时间复杂度:O(n)。

空间复杂度:O(1)。

执行结果:

方法二、数学法

分析:首先我们有numBottles瓶酒,那么一定会得到numBottles个空瓶,其中每numExchange个空瓶兑换一瓶新酒,这样每次兑换其实是消耗了(numExchange-1)个酒瓶,因此可以转化为求公式(numBottles−n*(numExchange−1)≥numExchange)打破平衡的n值,那么 n= (numBottles - numExchange) / (numExchange - 1) + 1。注意:不存在赊账的情况,即 numBottles >= numExchange 才能兑换,不能在剩两个空瓶的时候,先借一个空瓶兑换一瓶喝完后再还。

代码:(C++)


  
  1. class Solution {
  2. public:
  3. int numWaterBottles(int numBottles, int numExchange) {
  4. return numBottles >= numExchange ? (numBottles - numExchange) / (numExchange - 1) + 1 + numBottles : numBottles;
  5. }
  6. };

时间复杂度:O(1)。

空间复杂度:O(1)。

执行结果:

 

文章来源: liuzhen.blog.csdn.net,作者:Data-Mining,版权归原作者所有,如需转载,请联系作者。

原文链接:liuzhen.blog.csdn.net/article/details/107677940

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。