数据结构与算法之栈: LeetCode 3100. 换水问题 II (Ts版)

换水问题 II

  • 给你两个整数 numBottles 和 numExchange 。

  • numBottles 代表你最初拥有的满水瓶数量。在一次操作中,你可以执行以下操作之一:

    • 喝掉任意数量的满水瓶,使它们变成空水瓶。
    • 用 numExchange 个空水瓶交换一个满水瓶。然后,将 numExchange 的值增加 1 。
  • 注意,你不能使用相同的 numExchange 值交换多批空水瓶。例如,如果 numBottles == 3 并且 numExchange == 1 ,则不能用 3 个空水瓶交换成 3 个满水瓶。

  • 返回你 最多 可以喝到多少瓶水。

示例 1

数据结构与算法之栈: LeetCode 3100. 换水问题 II (Ts版)_第1张图片
输入:numBottles = 13, numExchange = 6
输出:15

解释:上表显示了满水瓶的数量、空水瓶的数量、numExchange 的值,以及累计喝掉的水瓶数量

示例 2

数据结构与算法之栈: LeetCode 3100. 换水问题 II (Ts版)_第2张图片
输入:numBottles = 10, numExchange = 3
输出:13

解释:上表显示了满水瓶的数量、空水瓶的数量、numExchange 的值,以及累计喝掉的水瓶数量。

提示

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

Typescript 版算法实现


1 ) 方案1

function maxBottlesDrunk(numBottles: number, numExchange: number): number {
    let total = numBottles; 
    while (numBottles >= numExchange) { 
        // 每次喝完一瓶水后,会剩下一个空瓶,用空瓶交换新的水瓶
        numBottles += 1 - numExchange++; 
        total++; 
    }
    return total;
};

2 ) 方案2

function maxBottlesDrunk(numBottles: number, numExchange: number): number {
    let result = 0;
    // 空瓶子数量
    let emptyBottles = 0;
    // 标识:如果还有喝水/换水操作就继续再执行一次,直到无操作结束
    let flag = true;

    while (flag) {
        flag = false;

        // 喝水
        if (numBottles > 0) {
            result += numBottles;
            emptyBottles += numBottles;
            numBottles = 0;
            flag = true;
        }

        // 换水
        if (emptyBottles >= numExchange) {
            numBottles++;
            emptyBottles -= numExchange;
            numExchange++;
            flag = true;
        }
    }

    return result;
}

你可能感兴趣的:(Data,Structure,and,Algorithms,leetcode,算法)