[]LeetCode]Count of Range Sum

https://leetcode.com/problems/count-of-range-sum/

求和用long




解法一:

归并排序,同时计数

public class Solution {
    public int countRangeSum(int[] nums, int lower, int upper) {
        if (nums == null || nums.length == 0) {
            return 0;
        }
        int len = nums.length;
        long[] sum = new long[len + 1];
        for (int i = 0; i < len; i++) {
            sum[i + 1] = sum[i] + nums[i];
        }
        return mergeAndCount(sum, 0, len + 1, lower, upper);
    }
    private int mergeAndCount(long[] sum, int beg, int end, int lower, int upper) {
        if (end - beg <= 1) {
            return 0;
        }
        int mid = beg + (end - beg) / 2;
        // 归并排序的同时进行计数。递归保证了beg~mid和mid~end已经分别有序。而[i, j]的部分和等于sum[j] - sum[i] && j > i
        // 这样可以遍历mid~end找到在beg~mid之中特定i位置对应mid~end之中的上下界
        int count = mergeAndCount(sum, beg, mid, lower, upper) + mergeAndCount(sum, mid, end, lower, upper);
        int j = mid;
        int k = mid;
        int t = mid;
        long[] cache = new long[end - beg];
        for (int i = beg, r = 0; i < mid; i++, r++) {
            while (j < end && sum[j] - sum[i] < lower) j++;
            while (k < end && sum[k] - sum[i] <= upper) k++;
            while (t < end && sum[t] < sum[i]) cache[r++] = sum[t++];
            cache[r] = sum[i];
            count += k - j;
        }
        // 当前需要归并排序的是sum之中beg~end的部分,t之后的位置已经是有序的,并且均比nums[mid - 1]更大,所以不再需要copy。
        // cache之中是已经排序好的剩余部分
        System.arraycopy(cache, 0, sum, beg, t - beg);
        return count;
    }
}


解法二:

线段树&树状数组

待解...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值