题解
题目比较简单 每个人轮流 直到k减为负数
普通方法 先求所有学生需要的粉笔数量 k%总数 就是最后一轮的粉笔数量 最后遍历减一遍就能算出答案 注意前面求需要粉笔总数的时候开long long型
class Solution {
public:
int chalkReplacer(vector<int>& chalk, int k) {
long long sum = 0;
int n = chalk.size();
for(int i=0; i<n; i++) {
sum += chalk[i];
}
k = k % sum;
for(int i=0; i<n; i++) {
k-= chalk[i];
if (k<0) return i;
}
return 0;
}
};
前缀和+二分查找
思路和前面的类似 只是前面求和 这边求前缀和 方便下一步遍历 只需要二分就行 不需要顺序查找
class Solution {
public:
int bin_search(int left, int right, int target, const vector<int> &chalk) {
while(left <= right) {
int mid = (left + right) / 2;
if(chalk[mid] > target) right = mid - 1;
else left = mid+1;
}
return left;
}
int chalkReplacer(vector<int>& chalk, int k) {
int n = chalk.size();
if (chalk[0] > k) return 0;
for(int i=1; i<n; i++) {
chalk[i] += chalk[i-1];
if (chalk[i] > k) return i;
}
k = k % chalk[n-1];
return bin_search(0, n-1, k, chalk);
}
};