子数组和小于C的个数

条件:数组 x 中数以及C为整数,假定结果不爆 int
1、都为正整数
滑动窗口,从[lo=0, hi=0]开始维护即可,时间:O(n)
2、任意整数
思路:维护一个前缀和 prefix 以及有序集合 set,遍历到 x[i] 时,更新 prefix,同时将 prefix加入 set,此时,我们只要在 set 中找 最小的>=prefix-(C-1) 的前缀和 p 即可(剩下的必然尽可能接近C),用 prefix-p 更新答案即可。时间:O(nlogn)

int maxSubSumLessC(vector<int>& x, int C) {
    int ans = 0;
    int prefix = 0;
    set<int> st;
    st.insert(0); //
    for(auto num : x) {
        prefix += num;
        st.insert(prefix);
        auto p = lower_bound(st.begin(), st.end(), prefix-(C-1));    
        if(p != st.end()) ans = max(ans, prefix-*p);
    }
    return ans;
}
全部评论

相关推荐

11-15 18:39
已编辑
西安交通大学 Java
全村最靓的仔仔:卧槽,佬啥bg呢,本也是西交么
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务