leetcode 390排除ゲーム

すべての行を排除します!最後の生存者は誰でしたか?

問題としての意味は以下の通り
に1から整数のリストを与えられたn個注文しました。
まず、左から右へ、最初の数字で始まる、リストの最後まで、他のすべての数字を削除します。
リストの先頭までの第二段階、残りの番号、右から左へ、最後から二番目の数字で始まる、削除するすべての数字、。
私たちは、1つの番号まで、左から右と交互に左に右に、これらの2つの手順を繰り返します。
長さのリストを返します。nは、最後に残った数字。

例:
入力:
。N- = 9、
1 2 3 4 5 6 7 8 9
2 4 6 8
26
6
出力:
6

まず、観察し、分析するサンプル
の法律がなかった何カンカンを

最初の13579 区間番号2が最初に削除されている
48第4削除されていない最初の数字の間隔
2第三の間隔を最初の数8を削除され
...

  1. 2 ^ n個のN番目のサブインターバル
  2. 右から左へ削除します時間
    ときの残りの数奇数最初の番号が削除され
    たときの残数さえ 最初の番号は削除されません
  3. すべての削除が終了
    残数を残る/ = 2
アルゴリズム設計:

RESの最初の数は、先頭マーク
各ステップマーキングのステップ
トラバーサル方向を表してleft2rightを

左から右へ
-最初の番号は削除されますRESの更新を
右から左へ
のとき、残りの数奇数最初の番号が削除されます- RESは、更新され
たときの残りの数さえ最初の番号は削除されません- RESは変わりません

各一次トラバースSTEP 2 =
left2right 否定

次のようにコードがあります

class Solution {
public:
    int lastRemaining(int n) {
        bool left2right = true;
        int res = 1, step = 1, remain = n;
        while (remain > 1) {
            if (left2right || remain % 2 == 1) res += step;
            remain /= 2;
            step *= 2;
            left2right = !left2right;
        }
        return res;
    }
};
公開された34元の記事 ウォンの賞賛0 ビュー591

おすすめ

転載: blog.csdn.net/Luyoom/article/details/103653120