一、环境说明
- 本文是 LeetCode 1894题 : 找到需要补充粉笔的学生编号,使用c语言实现
- 前缀和+二分查找
- 测试环境:Visual Studio 2019
二、代码展示
int binarySearch(int chalk[],int chalkSize,int k){
int left =0,right = chalkSize -1,mid =0;
while(left<=right){
mid = left+((right - left)>>1);
if(chalk[mid]>k){
right = mid - 1;
}else {
left = mid + 1;
}
}
return left;
}
int chalkReplacer(int* chalk, int chalkSize, int k){
if(chalk[0]>k){
return 0;
}
for(int i = 1;i<chalkSize;i++){
chalk[i]+=chalk[i-1];
if(chalk[i]>k){
return i;
}
}
return binarySearch(chalk, chalkSize,k%chalk[chalkSize-1]);
}
三、思路分析
- 1000字的题目,提取关键词,取余,前缀和,二分查找。
- 一次遍历chalk数组,取每个数的前缀和,在生成前缀和的过程中,如果前缀和大于k,则返回下标i。
- 如果正常生成前缀和,那么chalk[chalkSize-1]就是所有数的和,我们用k%chalk[chalkSize-1],表示在所有人都参与了好多轮消耗粉笔后,剩余的粉笔数量,这个粉笔数量将在这一轮消耗中殆尽。
- 是第几个小伙伴用完粉笔?我们查找前缀和数组就知道了。正数的前缀和数组天然有序,二分查找,返回那个幸运儿的下标。本题完成。
- 二分查找的结果是手法问题,感兴趣的小伙伴,可以做力扣的二分专项,唯手熟尔。
四、代码分析
- 理解思路很重要!
- 博主一遍就写出代码AC了,没加注释。
- 博主欢迎读者在评论区留言,作为日更博主,看到就会回复的。
五、AC
![AC](https://img-blog.csdnimg.cn/fb57ebcb1712488a933b480d802bc099.png)
六、复杂度分析
- 时间复杂度:O(n) ,n是chalk数组的大小。实际上,时间复杂度是O(n+logn),遍历chalk数组的时间复杂度是O(n),二分查找的时间复杂度是O(logn)。
- 空间复杂度:O(1),除若干变量使用的常量空间,没有额外使用线性空间。