すべての行を排除します!最後の生存者は誰でしたか?
問題としての意味は以下の通り
に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を削除され
...
- 2 ^ n個のN番目のサブインターバル
- 右から左へ削除します時間
ときの残りの数奇数最初の番号が削除され
たときの残数さえ 最初の番号は削除されません - すべての削除が終了
残数を残る/ = 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;
}
};