給你一個下標從 0 開始的正整數數組 candiesCount ,其中 candiesCount[i] 表示你擁有的第 i 類糖果的數目。同時給你一個二維數組 queries ,其中 queries[i] = [favoriteTypei, favoriteDayi, dailyCapi] 。
你按照如下規則進行一場游戲:
你從第 0 天開始吃糖果。
你在吃完 所有 第 i - 1 類糖果之前,不能 吃任何一顆第 i 類糖果。
在吃完所有糖果之前,你必須每天 至少 吃 一顆 糖果。
請你構建一個布爾型數組 answer ,滿足 answer.length == queries.length 。answer[i] 為 true 的條件是:在每天吃 不超過 dailyCapi 顆糖果的前提下,你可以在第 favoriteDayi 天吃到第 favoriteTypei 類糖果;否則 answer[i] 為 false 。注意,只要滿足上面 3 條規則中的第二條規則,你就可以在同一天吃不同類型的糖果。
請你返回得到的數組 answer 。
示例 1:
輸入:candiesCount = [7,4,5,3,8], queries = [[0,2,2],[4,2,4],[2,13,1000000000]]
輸出:[true,false,true]
提示:
- 在第 0 天吃 2 顆糖果(類型 0),第 1 天吃 2 顆糖果(類型 0),第 2 天你可以吃到類型 0 的糖果。
- 每天你最多吃 4 顆糖果。即使第 0 天吃 4 顆糖果(類型 0),第 1 天吃 4 顆糖果(類型 0 和類型 1),你也沒辦法在第 2 天吃到類型 4 的糖果。換言之,你沒法在每天吃 4 顆糖果的限制下在第 2 天吃到第 4 類糖果。
- 如果你每天吃 1 顆糖果,你可以在第 13 天吃到類型 2 的糖果。
-
示例 2:
輸入:candiesCount = [5,2,6,4,1], queries = [[3,1,2],[4,10,3],[3,10,100],[4,100,30],[1,3,1]]輸出:[false,true,true,false,false]
解題思路
- 計算最快速度吃到favoriteType需要多少天(一天吃dailyCap顆)
- 計算最慢速度吃到favoriteType需要多少天(一天吃一顆)
- 處于這兩者之間的天數,都是我們可到達的天數
為了加快速度我們可以,維護一個前綴和,記錄下吃到favoriteType糖果之前,需要吃到多少顆的其他糖果。最短天數和最長天數就是由favoriteType之前有多少顆糖果決定的
- 一天吃一顆需要sum[favoriteType+1](包含favoriteType的糖果數量)
- 一天吃dailyCap顆需要sum[favoriteType]/dailyCap+1(不包含favoriteType的糖果數量)
代碼
func canEat(candiesCount []int, queries [][]int) []bool {bools := make([]bool,len(queries))sum := make([]int, len(candiesCount)+1)for i := 1; i <= len(candiesCount); i++ {sum[i]+=candiesCount[i-1]+sum[i-1]}for j, query := range queries {//中間就算合適的天數就是可以達到的天數//因為是從0開始統計的,而我們所需要的天數應該是favoriteDay+1favoriteType,favoriteDay,dailyCap:=query[0],query[1]+1,query[2]if favoriteDay>=sum[favoriteType] / dailyCap+1&&favoriteDay<=sum[favoriteType+1]{bools[j]=true}}return bools
}