模拟:
class Solution {
public int chalkReplacer(int[] chalk, int k) {
int i = 0;
while (k>=chalk[i]){
k-=chalk[i];
i++;
if(i==chalk.length){
i = 0;
}
}
return i;
}
}
简化模拟:
class Solution {
public int chalkReplacer(int[] chalk, int k) {
int n = chalk.length;
long total = 0;
for (int num : chalk) {
total += num;
}
k %= total;
int res = -1;
for (int i = 0; i < n; ++i) {
if (chalk[i] > k) {
res = i;
break;
}
k -= chalk[i];
}
return res;
}
}
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/find-the-student-that-will-replace-the-chalk/solution/zhao-dao-xu-yao-bu-chong-fen-bi-de-xue-s-qrn1/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
前缀和+二分查找
class Solution {
public int chalkReplacer(int[] chalk, int k) {
int n = chalk.length;
long[] sum = new long[n + 1];
for (int i = 1; i <= n; i++) sum[i] = sum[i - 1] + chalk[i - 1];
k = (int)(k % sum[n]);//最后一轮开始前的粉笔数量
int l = 1, r = n;
while (l <= r) {
int mid = l + r + 1 >> 1;
if (sum[mid] <= k) l = mid+1;
else r = mid - 1;
}
return sum[r] <= k ? r : r - 1;
}
}
二分查找固定套路