LC1894-找到需要补充粉笔的学生编号
1894. 找到需要补充粉笔的学生编号
法1:遍历,时间复杂度\(O(n)\)
先走一轮,同时统计一轮共需多少粉笔数,并且如果发现粉笔数不够直接返回答案。
然后将剩余\(k\)对一轮总和取\(mod\),最后再走一轮,如果发现不够返回答案。
class Solution {
public:
int chalkReplacer(vector<int>& chalk, int k) {
int res = -1, n = chalk.size(), tot = 0;
for(int i = 0; i < n; ++i){
if(k >= chalk[i]) k -= chalk[i];
else {
res = i;
break;
}
tot += chalk[i];
}
if(~res)return res;
k -= (k / tot) * tot;
for(int i = 0; i < n; ++i){
if(k >= chalk[i]) k -= chalk[i];
else {
res = i;
break;
}
}
return res;
}
};
法2:前缀和 + 二分,时间复杂度\(O(n)\)
\(s\) 为 \(chalk\) 的前缀和数组将 $ k $ 对 \(s[n]\) 取 \(mod\) ,然后二分出第一个 $sum[i] > k $ 的 \(i\)
using ll = long long;
class Solution {
public:
int chalkReplacer(vector<int>& chalk, int k) {
int n = chalk.size();
vector<ll>s(n + 1);
for(int i = 1; i <= n; ++i)s[i] = s[i - 1] + chalk[i - 1];
k %= s[n];
int l = 1, r = n;
while(l < r){
int mid = l + (r - l) / 2;
if(s[mid] > k)r = mid;
else l = mid + 1;
}
return l - 1;
}
};