問題の説明
n個の数字0、1、n-1は、数字の0から始まり、毎回この円からm番目の数字を削除して円に配置されます。このサークルに残っている最後の番号を見つけます。
たとえば、5桁の0、1、2、3、および4は円を形成し、3桁目は数字0から毎回削除され、削除された最初の4桁は2、0、4、1などとなります。残りの数は3です。
入力:n = 5、m = 3
出力:3
問題解決レポート
- n人の人数は 、次のように番号を削除します 人、次に削除された人 はカウントを開始し、対応する数列は 。
- 残り 人の数のマッピングを作成し、それをにマッピングします 、次に新しいシーケンスで は元のシーケンスです 。
- つまり、 最後の残りの人数は人です 、次に対応 人の最後に残った人のは 。
- 作る は 最後に残った人の数 。
実装コード
- 再帰的
class Solution {
public:
int f(int n, int m) {
if (n == 1)
return 0;
int x = f(n - 1, m);
return (m + x) % n;
}
int lastRemaining(int n, int m) {
return f(n, m);
}
};
- 繰り返す
class Solution {
public:
int lastRemaining(int n, int m) {
int ans=0;
for(int i=2;i<=n;i++){
ans=(ans+m)%i;
}
return ans;
}
};