LeetCode 2582. 枕を渡す: O(1) 時間アルゴリズムを明確な言葉で説明する

【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人が左から右に枕を渡す必要があります。n1回。同様に、 n − 1 n-1 は右から左に渡す必要があります。n1回。つまり、2 × ( n − 1 ) 2\times(n-1)2×( n1 ) 1 サイクルします。

したがって、時間時間最後の2 × ( n − 1 ) 2\times(n-1) を直接法とする時間2×( n1 )は 1 回の送信の結果に相当します。

  • 時間 ≤ n − 1の場合、時間\leq n-1時間_ _n1、それは右に通過していることを意味します。パス0 01 1で01、パス1 12 2に12、…、時間time時間time + 1 time + 1です時間_ _+1

  • それ以外の場合は、左側に通過することを意味します。左に移動時間 − ( n − 1 ) 時間 − (n - 1)時間_ _( n1 )回。左にパス0 0nnで0n、左に渡します1 1n − 1 n-1で1n1 ,..., 左に移動time − ( n − 1 ) time - (n - 1)時間_ _( n1 )次以降n − ( 時間 − ( n − 1 ) ) = 2 ∗ n − 時間 − 1 n - (時間 - (n - 1)) = 2 * n - 時間 - 1n(時間_ _( n1 ))=2n時間_ _1

  • 時間計算量O ( 1 ) O(1)

  • 空間複雑度O ( 1 ) O(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

おすすめ

転載: blog.csdn.net/Tisfy/article/details/133294825