【LetMeFly】2582. 枕を渡す: O(1) 時間アルゴリズムを明確な言葉で説明する
Leetcode の質問リンク: https://leetcode.cn/problems/pass-the-pillow/
n
個人は一列に並び、1
から までの番号が付けられますn
。
最初は列の先頭にいる人が枕を持ちます。枕を持っている人は毎秒、列に並んでいる次の人に枕を渡します。枕が列の先頭または最後尾に到達すると、配送の方向が変わり、チームは反対方向に枕を渡し続けます。
- たとえば、枕が -
n
人目に届いたら、TA は - 人目に枕を渡しn - 1
、さらに -n - 2
人目に枕を渡します。
2 つの正の整数n
とを指定すると、数秒後に枕を保持している人の番号time
を返します。time
例 1:
入力: n = 4、時間 = 5 出力: 2 説明:チーム内の枕送りの状況は、1 -> 2 -> 3 -> 4 -> 3 -> 2 です。 5秒後、枕は2人目に渡されます。
例 2:
入力: n = 3、時間 = 2 出力: 3 説明:チーム内の枕配達状況は 1 -> 2 -> 3 です。 2秒後、枕は3人目に渡されます。
ヒント:
2 <= n <= 1000
1 <= time <= 1000
方法 1: 計算する
n 人が枕を渡しますが、n − 1 n-1人が左から右に枕を渡す必要があります。n−1回。同様に、 n − 1 n-1 は右から左に渡す必要があります。n−1回。つまり、2 × ( n − 1 ) 2\times(n-1)2×( n−1 ) 1 サイクルします。
したがって、時間時間最後の2 × ( n − 1 ) 2\times(n-1) を直接法とする時間2×( n−1 )は 1 回の送信の結果に相当します。
-
時間 ≤ n − 1の場合、時間\leq n-1時間_ _≤n−1、それは右に通過していることを意味します。パス0 01 1で0回1、パス1 12 2に1回2、…、時間time時間はtime + 1 time + 1です時間_ _+1。
-
それ以外の場合は、左側に通過することを意味します。左に移動時間 − ( n − 1 ) 時間 − (n - 1)時間_ _−( n−1 )回。左にパス0 0nnで0回n、左に渡します1 1n − 1 n-1で1回n−1 ,..., 左に移動time − ( n − 1 ) time - (n - 1)時間_ _−( n−1 )次以降n − ( 時間 − ( n − 1 ) ) = 2 ∗ n − 時間 − 1 n - (時間 - (n - 1)) = 2 * n - 時間 - 1n−(時間_ _−( n−1 ))=2∗n−時間_ _−1。
-
時間計算量O ( 1 ) O(1)○ (1)
-
空間複雑度O ( 1 ) O(1)○ (1)
ACコード
C++
class Solution {
public:
int passThePillow(int n, int time) {
time %= (n - 1) * 2;
return time <= n - 1 ? time + 1 : 2 * n - time - 1;
}
};
パイソン
class Solution:
def passThePillow(self, n: int, time: int) -> int:
time %= (n - 1) * 2
return time + 1 if time <= n - 1 else 2 * n - time - 1
記事はCSDNで同時公開されています。オリジナルであることは簡単ではありません。著者の同意を得て転載した後、元の記事へのリンクを添付してください〜
Tisfy: https://letmefly.blog.csdn.net/article/details/133294825