[LeetCode]303. Range Sum Query - Immutable ★

题目描述

Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive.
题目大意:给定一个数字数组,计算其中下标从 i 到 j 的元素的和,i,j 均合法且为闭区间。

样例

Example:

Given nums = [-2, 0, 3, -5, 2, -1]
sumRange(0, 2) -> 1
sumRange(2, 5) -> -1
sumRange(0, 5) -> -3

python解法

class NumArray:

    def __init__(self, nums: List[int]):
        self.nums = []
        for i,n in enumerate(nums):
            if i != 0:
                self.nums.append(self.nums[i-1]+n)
            else:
                self.nums.append(n)

    def sumRange(self, i: int, j: int) -> int:
        return self.nums[j] - (i and self.nums[i-1])

Runtime: 96 ms, faster than 54.19% of Python3 online submissions for Range Sum Query - Immutable.
Memory Usage: 17.3 MB, less than 10.00% of Python3 online submissions for Range Sum Query - Immutable.
题后反思:

  1. 这种题目最简单的思路就是直接将nums赋值给一个实例变量,然后给出范围是直接相加,但是这种方式无形中导致重复计算了很多次.
  2. 所以为了改进算法,可以在初始化的时候将列表的其实位置到当前位置的和计算好,在计算某个范围的和时直接做一次减法就可以了。
  3. 因为求的是闭区间的元素的和,所以在相减的时候下标为i的元素需要判断是否越界。

C语言解法

typedef struct {
    int *data;
} NumArray;

NumArray* numArrayCreate(int* nums, int numsSize) {
    NumArray* num = (NumArray*)malloc(sizeof(NumArray));
    num -> data = (int*)malloc(sizeof(int)*(numsSize+1));
    num -> data[0] = 0;
    for (int i=1;i<=numsSize;i++)
    {
        num -> data[i] = num -> data[i-1] + nums[i-1];
    }
    return num;                                  
}

int numArraySumRange(NumArray* obj, int i, int j) {
  return obj->data[j+1] - obj->data[i];
}

void numArrayFree(NumArray* obj) {
    free(obj->data);
    free(obj);
}

Runtime: 24 ms, faster than 72.22% of C online submissions for Range Sum Query - Immutable.
Memory Usage: 12.5 MB, less than 33.33% of C online submissions for Range Sum Query - Immutable.
题后反思:

  1. C语言解法中多申请了一个空间存放了0,从而保证了j+1不会越界(i,j都合法的前提下)

文中都是我个人的理解,如有错误的地方欢迎下方评论告诉我,我及时更正,大家共同进步

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值