題目描述
每年六一兒童節,牛客都會準備一些小禮物去看望孤兒院的小朋友,今年亦是如此,HF作為牛客的資深元老,自然也準備了一些小游戲,其中,有個游戲是這樣的:首先,讓小朋友們圍成一個大圈,然后,他隨機指定一個數m,讓編號為0的小朋友開始報數,每次喊到m-1的那個小朋友要出列唱首歌,然后可以在禮品箱中任意的挑選禮物,并且不再回到圈中,從他的下一個小朋友開始,繼續0...m-1報數....這樣下去....直到剩下最后一個小朋友,可以不用表演,并且拿到牛客名貴的“名偵探柯南”典藏版(名額有限哦!!_),請你試著想下,哪個小朋友會得到這份禮品呢?(注:小朋友的編號是從0到n-1)
如果沒有小朋友,請回傳-1
思路
陣列模擬,
時間復雜度O(mn),空間復雜度O(1),
遞推分析,
f(i) = (f(i-1) + m) % i
時間復雜度O(n),空間復雜度O(1),
陣列模擬代碼
public class Solution {
public int LastRemaining_Solution(int n, int m) {
if(n < 1 || m < 1) return -1;
int[] arr = new int[n];
int index = -1;
int count = 0;
int num = n;
while(num > 0) {
index++;
if(index >= n) {
index = 0;
}
if(arr[index] == 1) {
continue;
}
count++;
if(count == m) {
arr[index] = 1;
num--;
count = 0;
}
}
return index;
}
}
遞推代碼
public class Solution {
public int LastRemaining_Solution(int n, int m) {
if(n < 1 || m < 1) return -1;
int ans = 0;
for(int i = 2; i <= n; i++) {
ans = (ans + m) % i;
}
return ans;
}
}
筆記
無
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/205846.html
標籤:其他
上一篇:撲克牌順子
下一篇:最小堆的插入洗掉函式
