1894.找到需要补充粉笔的学生编号
题目描述
思路:模拟、前缀和+二分查找
模拟
根据题意,可以进行模拟。因为每个学生消耗粉笔的过程是重复的。记每一轮消耗的粉笔总数total,等于chalk数组的所有元素之和。将粉笔总数k对total进行取模,求得余数k’方便后续计算。因为k’必定小于total,所以只需要至多遍历一次chalk数组,模拟k’减小的过程,就可以得到需要补充粉笔的学生编号。
class Solution:
def chalkReplacer(self, chalk: List[int], k: int) -> int:
# 模拟
total = sum(chalk)
k %= total
res = -1
for i, cnt in enumerate(chalk):
if cnt > k:
res = i
break
k -= cnt
return res
前缀和+二分查找
其实思路没有什么区别,只是在遍历chalk时使用了二分查找来降低时间复杂度。
class Solution:
def chalkReplacer(self, chalk: List[int], k: int) -> int:
# 前缀和+二分查找
return bisect_right((presum := list(accumulate(chalk))), k % presum[-1])