Leetcodeインタビューの質問62.サークルの最後に残っている番号

問題の説明

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人の人数は 0 1 2 1 0、1、2、\ cdots、n-1 、次のように番号を削除します m 1 m-1 人、次に削除された人 k + 1 k + 1 はカウントを開始し、対応する数列は m , m + 1 , , n 1 , 0 , , m 2 m、m + 1、\ cdots、n-1,0、\ cdots、m-2
  • 残り n 1 n-1 人の数のマッピングを作成し、それをにマッピングします 0 , 1 , , n 2 0、1、\ cdots、n-2 、次に新しいシーケンスで x バツ は元のシーケンスです ( x + m ) % n (x + m)\%n
  • つまり、 n 1 n-1 最後の残りの人数は人です x バツ 、次に対応 n 人の最後に残った人の ( x + m ) % n (x + m)\%n
  • 作る f ( n ) f(n) n 最後に残った人の数 f ( n ) = ( f ( n ) + m ) % n f(n)=(f(n)+ m)\%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;
    }
};
MD_
139の元の記事を公開 賞賛8 10,000+ビュー

おすすめ

転載: blog.csdn.net/qq_27690765/article/details/105210599