zoukankan      html  css  js  c++  java
  • 327. 区间和的个数

    给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数,包含 lower 和 upper
    区间和 S(i, j) 表示在 nums 中,位置从 i 到 j 的元素之和,包含 i 和 j (i ≤ j)。

    说明:
    最直观的算法复杂度是 O(n2) ,请在此基础上优化你的算法。

    示例:

    输入: nums = [-2,5,-1], lower = -2, upper = 2,
    输出: 3 
    解释: 3个区间分别是: [0,0], [2,2], [0,2],它们表示的和分别为: -2, -1, 2。


    use merge sort
    class Solution {
    public:
        int countRangeSum(vector<int>& nums, int lower, int upper) {
            vector<long long> sum(nums.size() + 1, 0);
            for (int i = 0; i < nums.size(); ++i) 
                sum[i + 1] = sum[i] + nums[i];
            
            return merge(sum, 0, sum.size(), lower, upper);
        }
            
        int merge(vector<long long>& nums, int start, int end, int lower, int upper) {
            if (end - start <= 1) return 0;
                
            int middle = start + (end - start) / 2;
            int count = merge(nums, start, middle, lower, upper) + 
                        merge(nums, middle, end, lower, upper);
                
            int small = middle;
            int between = middle;
            for (int i = start; i < middle; ++i) {
                while (small < end && nums[small] - nums[i] < lower) 
                    ++small;
                while (between < end && nums[between] - nums[i] <= upper)
                    ++between;
            count += between - small;
            }
                
            inplace_merge(nums.begin() + start, nums.begin() + middle, nums.begin() + end);
            return count;
        }
    };
  • 相关阅读:
    JavaScript丨数组元素反转
    Executor框架浅析
    索引相关
    关系型数据库
    Cookie和Session
    HTTP和HTTPS
    TCP,UDP,HTTP
    OSI模型
    剑指Offer19
    剑指Offer03
  • 原文地址:https://www.cnblogs.com/xxxsans/p/13939997.html
Copyright © 2011-2022 走看看