n
チケットを買うために列に並んでいる人 がいて 、その0th
人は 列の 先頭(n - 1)th
で、その 人は 列の後ろです。
その人が購入したい チケットの数が である 長さの 0 から始まるインデックスの 整数配列が 与えられます 。tickets
n
ith
tickets[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;
}
}