LeetCode 2073. チケット購入に必要な時間

n チケットを買うために列に並んでいる人 がいて 、その0th 人は  列の 先頭(n - 1)thで、その 人は  列の後ろです。

 その人が購入したい  チケットの数が である  長さの 0 から始まるインデックスの 整数配列が 与えられます ticketsnithtickets[i]

一人が  チケットを購入するのにかかる時間はちょうど 1 秒です。人は 一度に 1 枚のチケットしか購入できず、さらにチケットを購入するには 列の 最後尾 に戻らなければなりません (これは瞬時に行われます)。購入するチケットが残っていない場合、その人は 列から離れ ます。

位置(0 からインデックス) にいる人が チケットの購入を完了するまでにかかった時間を返し ます k  

例 1:

入力: ticket = [2,3,2]、k = 2
出力: 6
説明:  
- 最初のパスでは、列の全員がチケットを購入し、列は [1, 2, 1] になります。
- 2 回目のパスでは、列の全員がチケットを購入し、列は [0, 1, 0] になります。
位置 2 の人は 2 枚のチケットを購入することに成功し、所要時間は 3 + 3 = 6 秒でした。

例 2:

入力: ticket = [5,1,1,1], k = 0
出力: 8
説明: 
- 最初のパスでは、列の全員がチケットを購入し、列は [4, 0, 0, 0] になります。
- 次の 4 つのパスでは、0 番目の人だけがチケットを購入します。
位置 0 の人は 5 枚のチケットを購入することに成功し、4 + 1 + 1 + 1 + 1 = 8 秒かかりました。

制約:

  • n == tickets.length
  • 1 <= n <= 100
  • 1 <= tickets[i] <= 100
  • 0 <= k < n

この質問を翻訳すると、配列を与え、その配列内の数値が順番に -1 されるたびに、k 番目の数値がいつ 0 になるかを尋ねます。

私は、毎回数値を -1 に順番に変更し、k 番目の数値が 0 になったときに終了し、その結果を戻り値とする while ループを強引に作成しました。

class Solution {
    public int timeRequiredToBuy(int[] tickets, int k) {
        int i = 0;
        int result = 0;
        while (tickets[k] != 0) {
            if (tickets[i] > 0) {
                tickets[i]--;
                result++;
            }
            i = (i + 1) % tickets.length;
        }
        return result;
    }
}

最適化が必要な場合は、この配列を 2 つの部分に分解できます。1 つの部分は k の前の数値です。これらは k を減算する前に減算する必要があるため、各数値が減算される回数は min(tickets[i], ticket[k]) となります。もう 1 つは k 以降の数字で、k を引いた後でしか減算できないため、減算される回数は min(tickets[k] - 1, ticket[i]) となります。for ループは配列をループしてそれらを加算するだけです。

class Solution {
    public int timeRequiredToBuy(int[] tickets, int k) {
        int result = tickets[k];
        for (int i = 0; i < k; i++) {
            result += Math.min(tickets[k], tickets[i]);
        }
        for (int i = k + 1; i < tickets.length; i++) {
            result += Math.min(tickets[k] - 1, tickets[i]);
        }
        return result;
    }
}

おすすめ

転載: blog.csdn.net/qq_37333947/article/details/132851192