题目链接: 点这里
思路: 前缀和 + 二分
分析: 由于一轮学生使用粉笔的总数量是固定的, 可以对粉笔总数量先求模, 然后使用二分找到哪个使得粉笔刚好不够用
class Solution {
public:
int chalkReplacer(vector<int>& chalk, int k) {
vector<long long> v(chalk.size(), 0);
v[0] = chalk[0];
for (int i = 1; i < chalk.size(); i++) {
v[i] = chalk[i] + v[i - 1];
}
k = k % v[v.size() - 1];
int l = 0, r = v.size() - 1;
while (l != r) {
int mid = (l + r) / 2;
if (v[mid] > k) r = mid;
else l = mid + 1;
}
return l;
}
};
复杂度分析
时间复杂度: 由于需要遍历一遍数组并且二分查找数组, 所以时间消耗为n + logn, 时间复杂度为O(n)
空间复杂度: 这里使用的数组存储前缀和, 所以空间复杂度为O(n)
二分查找补充:
二分查找存在一下两种情况
对于第一情况, 代码如下:
int binary_search(int l, int r, int target, int arr[]) {
while (l != r) {
int mid = (l + r) / 2;
if (arr[mid] > k) r = mid;
else l = mid + 1;
}
return l;
}
对于第二种情况, 代码如下:
int binary_search(int l, int r, int target, int arr[]) {
while (l != r) {
int mid = (l + r + 1) / 2;
if (arr[mid) < k) l = mid;
else r = mid - 1;
}
return l;
}