Range Sum Query - Immutable

这是一篇关于LeetCode算法题303的博客,讨论了如何在不允许修改输入数组的情况下,求给定索引范围内元素的和。文中提到了两种方法:直接计算和动态规划。直接计算方法的时间复杂度为O(n),而动态规划方法的时间复杂度为O(1)。
摘要由CSDN通过智能技术生成

Leetcode-Algorithm-DP-303

题目:
Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive.
(给定一个整型数组nums,计算索引i和j之间,包含所以i和j,所有元素的和。)

例子:
给定:
nums = [-2, 0, 3, -5, 2, -1]。
结果:
sumRange(0, 2) -> 1
sumRange(2, 5) -> -1
sumRange(0, 5) -> -3


题解:
方法1:(直接计算)
该方法没有什么技术水平,就是直接计算给定的索引之间的元素的和即可。

class NumArray {
private:
    vector<int> datas;

public:
    NumArray(vector<int> nums) {
        for (auto n : nums)
            datas.push_back(n);
    }

    int sumRange(int i, int j) {
        int sum = 0;
        for (int ix = i; ix <= j; ++ix)
            sum += datas[ix];
        return sum;
    }
};

分析:
除了构造对象时需要遍历一次数组来存储元素外,由于每次调用sumRange都要遍历一次数组,因此时间复杂度为 O(n)


方法2:(动态规划)
计算i和j之间(包含i和j)所有元素的和相当于计算前j个元素的总和以及前i个元素的总和,然后把结果相减即可。需要注意的是i和j都是包含在内的,所以计算前j个元素的和需要包括j,而计算前i个元素的和不需要包括i。

class NumArray {
private:
    vector<int> sums;

public:
    NumArray(vector<int> nums) : sums(nums.size()+1, 0) {
        partial_sum(nums.begin(), nums.end(), sums.begin()+1);
    }

    int sumRange(int i, int j) {
        return sums[j+1] - sums[i];
    }
};

分析:
除了在构造对象时需要遍历一次数组来存储所有包含当前索引之间的元素的和之外,一旦所有的和都计算完后,剩下每次调用sumRange只需要计算对应索引下总和之差即可。因此,调用sumRange的时间复杂度仅为 O(1)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值