LeetCode Count of Range Sum

Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusive.
Range sum S(i, j) is defined as the sum of the elements in nums between indices i and j (i ≤ j), inclusive.

Note:
A naive algorithm of O(n2) is trivial. You MUST do better than that.

Example:
Given nums = [-2, 5, -1], lower = -2, upper = 2,
Return 3.
The three ranges are : [0, 0], [2, 2], [0, 2] and their respective sums are: -2, -1, 2.

思路:
range sum一般会转化为前缀和的问题prefix sum

解法(分治法):

int countRangeSum(vector<int>& nums, int lower, int upper)
{
    //get the prefix sum
    vector<long long> prefix(nums.size() + 1, 0);
    for(int i = 1; i<=nums.size(); i++)
        prefix[i] = prefix[i-1] + nums[i-1];
    return countMergeSort(prefix, 0, nums.size(), lower, upper);
}
int countMergeSort(vector<long long>& prefix, int start, int end, int lower, int upper)
{
    if(start >= end) return 0;
    int mid = (start + end) >> 1;
    int count = countMergeSort(prefix, start, mid, lower, upper) + countMergeSort(prefix, mid+1, end, lower, upper);
    vector<long long> tmp(end-start+1);
    int lowerBound = mid+1, upperBound = mid+1, right = mid+1, tmpindex = 0;
    for(int left = start; left<=mid; left++)
    {
        while(lowerBound<=end && prefix[lowerBound] - prefix[left] < lower)
            lowerBound++;
        while(upperBound<=end && prefix[upperBound] - prefix[left] <= upper)
            upperBound++;
        count += upperBound - lowerBound;
        while(right<=end && prefix[right] < prefix[left])
            tmp[tmpindex++] = prefix[right++];
        tmp[tmpindex++] = prefix[left];
    }
    for(int i = 0; i<tmpindex; i++)
        prefix[start+i] = tmp[i];
    return count;
}

伴随着对prefix sum数组(不是原数组)的归并排序,我们在O(nlogn)时间找到了满足条件的前缀和之差的个数。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 7,486评论 0 10
  • My code: reference:https://discuss.leetcode.com/topic/337...
    Richardo92阅读 698评论 0 0
  • #易效能时间管理践行# 爱非坚持 20170509 44/90 晚间检视 1、三只青蛙完成 2、日语学习: 每日日...
    虾虾说阅读 399评论 0 1
  • 今天看的美国电影《蝙蝠侠大战超人:正义黎明》 看了这么多年的各种侠电影,这部片虽然演员我都很喜欢,但质量和内容真的...
    迷失在沙漠中的旅人阅读 185评论 0 0
  • 今天13号了,11号之后就没有再看到你。。。昨天今天确实一直想问,宛如时光在不在,但是我有些不敢问了,我怕你不在,...
    YJ小哥阅读 166评论 0 0