题目:
leetcode 327题
给你一个整数数组 nums 以及两个整数 lower 和 upper 。求数组中,值位于范围 [lower, upper] (包含 lower 和 upper)之内的 区间和的个数 。
区间和 S(i, j) 表示在 nums 中,位置从 i 到 j 的元素之和,包含 i 和 j (i ≤ j)。 来源:力扣(LeetCode)
题目链接:https://leetcode-cn.com/problems/count-of-range-sum
代码:
【源自labuladong的解析 链接:https://labuladong.gitee.io/algo/2/19/38/】
运行时间:62ms
运行内存:59.7MB
【注:自己写的是时间复杂度为O(n^2)的暴力解,通过案例92.54%。剩余的因为超出时间限制无法通过。暴力解能写出来。代码最后给出】
**给的解析代码的重点:**在merge方法中的count=count+end-start的那一部分代码的含义:滑动窗口为end-start,使得窗口内的元素与num[i]的差落在[lower,upper]内
这题需要注意的一个点是,会溢出int类型数据范围,需要使用long类型存储。【int:(-2147483648,2147483647)2的31次方;long:(-9223372036854774808,9223372036854774807)2的63次方】
class Solution{
private int lower, upper;
public int countRangeSum(int[] nums, int lower, int upper) {
this.lower = lower;
this.upper = upper;
// 构建前缀和数组,注意 int 可能溢出,用 long 存储
long[] preSum = new long[nums.length + 1];
for (int i = 0; i < nums.length; i++) {
// 第一个位置不存,为初始化的值0
preSum[i + 1] = (long)nums[i] + preSum[i];
}
System.out.println("原数组前缀和数组:"+Arrays.t