【題目描述】
排排坐吞彤,分糖果饰恕。
我們買了一些糖果 candies俱恶,打算把它們分給排好隊(duì)的 n = num_people 個(gè)小朋友俐银。
給第一個(gè)小朋友 1 顆糖果吱七,第二個(gè)小朋友 2 顆踊餐,依此類推三痰,直到給最后一個(gè)小朋友 n 顆糖果。
然后获搏,我們?cè)倩氐疥?duì)伍的起點(diǎn),給第一個(gè)小朋友 n + 1 顆糖果,第二個(gè)小朋友 n + 2 顆诅蝶,依此類推语盈,直到給最后一個(gè)小朋友 2 * n 顆糖果。
重復(fù)上述過程(每次都比上一次多給出一顆糖果,當(dāng)?shù)竭_(dá)隊(duì)伍終點(diǎn)后再次從隊(duì)伍起點(diǎn)開始),直到我們分完所有的糖果绅喉。注意,就算我們手中的剩下糖果數(shù)不夠(不比前一次發(fā)出的糖果多),這些糖果也會(huì)全部發(fā)給當(dāng)前的小朋友红省。
返回一個(gè)長(zhǎng)度為 num_people麻诀、元素之和為 candies 的數(shù)組呻率,以表示糖果的最終分發(fā)情況(即 ans[i] 表示第 i 個(gè)小朋友分到的糖果數(shù))元践。
【示例1】
輸入:candies = 7, num_people = 4
輸出:[1,2,3,1]
解釋:
第一次,ans[0] += 1,數(shù)組變?yōu)?[1,0,0,0]愉豺。
第二次摘盆,ans[1] += 2箱熬,數(shù)組變?yōu)?[1,2,0,0]。
第三次,ans[2] += 3陪汽,數(shù)組變?yōu)?[1,2,3,0]。
第四次赞庶,ans[3] += 1(因?yàn)榇藭r(shí)只剩下 1 顆糖果)澜薄,最終數(shù)組變?yōu)?[1,2,3,1]丧靡。
【示例2】
輸入:candies = 10, num_people = 3
輸出:[5,2,3]
解釋:
第一次,ans[0] += 1,數(shù)組變?yōu)?[1,0,0]绸狐。
第二次若债,ans[1] += 2蠢琳,數(shù)組變?yōu)?[1,2,0]傲须。
第三次菇绵,ans[2] += 3永乌,數(shù)組變?yōu)?[1,2,3]。
第四次惕味,ans[0] += 4愧杯,最終數(shù)組變?yōu)?[5,2,3]黄刚。
【思路】
1、剛開始題目理解有誤民效,一直驗(yàn)證不成功憔维,題目是一直輪詢轉(zhuǎn)圈,1+...+n畏邢, n+1+...+2n业扒, 2n+1+..+33.........
2、所以只要糖果總數(shù)大于1 就一直循環(huán)舒萎,直到分完
3程储、數(shù)組下標(biāo)需要取余人數(shù) candies%num_count 這樣數(shù)組才可以一直循環(huán)下去
4、時(shí)間復(fù)雜度O(n)
5臂寝、空間復(fù)雜度O(1)
swift代碼實(shí)現(xiàn):
func distributeCandies1(_ candies: Int, _ num_people: Int) -> [Int] {
var result = Array.init(repeating: 0, count: num_people)
var step = 0
var all = candies
while all > 0 {
let tmp = min(all, step+1)
let index = step%num_people
result[index]+=tmp
step+=1
all-=step
}
return result
}