n個の数字0、1、n-1は、数字の0から始まり、毎回この円からm番目の数字を削除して円に配置されます。このサークルに残っている最後の番号を見つけます。
たとえば、5桁の0、1、2、3、および4は円を形成し、3桁目は数字0から毎回削除され、削除される最初の4桁は2、0、4、1などとなります。残りの数は3です。
例1:
入力:n = 5、m = 3
出力:3
例2:
入力:n = 10、m = 17
出力:2
制限:
1 <= n <= 10 ^ 5
1 <= m <= 10 ^ 6
出典:LeetCode
リンク:https ://leetcode-cn.com/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof
著作権は控除ネットワークに属しています。商用転載の正式な許可書に連絡し、非商用転載の出典を明記してください。
再帰的メソッドのコード:
class Solution {
public:
int lastRemaining(int n, int m) {
int s=0;
for(int i=2;i<=n;i++)
s=(s+m)%i;
return s;
}
};
公式説明のアイデア:
アイデア
タイトルの要件は、次のように表すことができます。長さnのシーケンスが与えられると、要素の数mが逆方向に削除され、要素の最終的な数が残りますか?
この質問にすばやく答えることは難しい。ただし、同時に、この問題が小さなサブ問題に分割される可能性があることも確認する必要があります。長さn-1のシーケンスの場合、いくつかの要素が残っていることがわかっている場合は、これから計算できます。長さnのシーケンスに対する答え。
アルゴリズム
上記の問題を関数f(n、m)としてモデル化します。この関数の戻り値は、残された要素のシーケンス番号です。
最初に、長さnのシーケンスは最初にm%n要素を削除し、次に長さn-1のシーケンスが残ります。次に、f(n-1、m)を再帰的に解くことができます。残りのn-1要素については、最後のいくつかの要素が残ることを知っているので、x = f(n-1、 m)。
m%n番目の要素を削除したため、シーケンスの長さはn-1になります。f(n-1、m)に対応する回答xがわかっている場合、長さnのシーケンスの最後に削除された要素は、m%nから数えてx番目の要素であることもわかります。したがって、f(n、m)=(m%n + x)%n =(m + x)%n。
f(n、m)、f(n-1、m)、f(n-2、m)、...を再帰f(1、m)の終わりまで再帰的に計算します。シーケンスの長さが1の場合、唯一の要素を残す必要があり、その数は0です。
class Solution {
int f(int n, int m) {
if (n == 1)
return 0;
int x = f(n - 1, m);
return (m + x) % n;
}
public:
int lastRemaining(int n, int m) {
return f(n, m);
}
};
その他の方法:
ドキュメント:Joseph Ring .note
リンク:http: //note.youdao.com/noteshare?id=ab67321edaaa3c68cf7ca9dd67fb9d02&sub=445688B547AC4F569E462F485698AD8D