classSolution{publicintchalkReplacer(int[] chalk,int k){int len = chalk.length;for(int i =0; i <= len; i++){//到最后一个值,开启下一轮循环if(i == len){
i =0;}if(k < chalk[i])return i;
k = k - chalk[i];}return-1;}}
(2) 前缀和
classSolution{publicintchalkReplacer(int[] chalk,int k){int len = chalk.length;long[] sum =newlong[len +1];//sum求的是,i前所有值之和for(int i =1; i <= len; i++)
sum[i]= sum[i -1]+ chalk[i -1];//将 k 对所有学生一次循环所消耗总粉笔数(sum[n])进行取模,得到最后一轮开始前的粉笔数量。
k =(int)(k % sum[len]);//左闭右开的区间int left =1;int right = len +1;while(left < right){int mid = left +(right - left)/2;if(sum[mid]<= k)
left = mid +1;else
right = mid;}return sum[right]<= k ? left : left -1;}}
(3)模拟
对单次循环消耗的总粉笔数取模操作,保了剩余的粉笔数必然会在单次遍历中消耗完成。
因此 O(logn) 的二分其实是没有必要的,只需要再对 chalk 进行最后一轮的遍历模拟即可。
classSolution{publicintchalkReplacer(int[] chalk,int k){int len = chalk.length;long max =0;//找出学生一轮消耗的粉笔总数for(int i : chalk)
max += i;//将 k 对所有学生一次循环所消耗总粉笔数(sum[n])进行取模,得到最后一轮开始前的粉笔数量。
k =(int)(k % max);//对最后一轮单独进行模拟for(int i =0; i < len; i++){
k -= chalk[i];if(k <0)return i;}return-1;// never}}
1. 找到需要补充粉笔的学生编号(1)暴力class Solution { public int chalkReplacer(int[] chalk, int k) { int len = chalk.length; for (int i = 0; i <= len; i++) { //到最后一个值,开启下一轮循环 if (i == len) { i = 0;