我的解法:模擬整個分配糖果的過程:時間複雜度為o(m
ax(c
andi
es,n
))o(max(\sqrt, n))
o(max(
cand
ies
,n))
,n是人數。
class
solution
else
} times += num_people;
// 分配的輪數
}return getcandy;
}}
——簡單優化的話,可以將for迴圈刪除,直接乙個while迴圈即可,
數學解法:o(n)
首先,求出最後一次分配中,那個孩子得到的糖果數:
接下來,計算發放的輪數:s/n
s/ns/
n(s代表次數,n代表人數),s%n,就是最後一輪中,還能分到糖果的孩子個數:
所以,對於普通孩子:kids[i]=i+(i+n)+(i+2n)+…(i+(rows-1)∗n),row = s/n
——又是等差數列:kids[i] = i∗r
ows+
n∗ro
ws(r
ow−1
))2i*rows + \frac
i∗rows
+2n∗
rows
(row
−1))
如果是特殊孩子,即最後一輪還能分到的孩子:直接在後面加即可:
class
solution
getcandy[extra]
+= remain;
return getcandy;
}}
——數學解法比較複雜,在時間有限的情況下,我選擇直接用模擬方法
參考:
1103 分糖果 II(簡單題)
題目描述 排排坐,分糖果。我們買了一些糖果 candies,打算把它們分給排好隊的 n num people 個小朋友。給第乙個小朋友 1 顆糖果,第二個小朋友 2 顆,依此類推,直到給最後乙個小朋友 n 顆糖果。然後,我們再回到隊伍的起點,給第乙個小朋友 n 1 顆糖果,第二個小朋友 n 2 顆,...
力扣1103 分糖果 II 解題記錄
題目 假設有m個糖果,n位小朋友。如果每個小朋友都分到一次算一輪,假設能分t輪,分完t輪後剩r個。即 知道了t也就求出了r m t。然後問題就簡單了,在前t輪中每個小朋友分到的糖果可以通過等差數列求和得出。第t 1輪就乙個小朋友乙個小朋友的分。第i個小朋友應該分t num people i個,若分完...
力扣 1103 分糖果 II C
排排坐,分糖果。我們買了一些糖果 candies,打算把它們分給排好隊的 n num people 個小朋友。給第乙個小朋友 1 顆糖果,第二個小朋友 2 顆,依此類推,直到給最後乙個小朋友 n 顆糖果。然後,我們再回到隊伍的起點,給第乙個小朋友 n 1 顆糖果,第二個小朋友 n 2 顆,依此類推,...