子数组和小于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;
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-10 11:45
你不要过来啊啊啊啊啊啊啊
码农索隆:对面:“今天你不面也得面”
点赞 评论 收藏
分享
昨天 13:47
门头沟学院 Java
投递小米集团等公司7个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务