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;
    }
};
posted @ 2021-09-10 10:29  Ivessas  阅读(32)  评论(0)    收藏  举报