使用kotlin解决这个问题:303. 区域和检索 - 数组不可变 给定一个整数数组 nums,处理以下类型的多个查询: 计算索引 left 和 right (包含 left 和 right)之间的 nums 元素的 和 ,其中 left <= right 实现 NumArray 类: NumArray(int[] nums) 使用数组 nums 初始化对象 int sumRange(int i, int j) 返回数组 nums 中索引 left 和 right 之间的元素的 总和 ,包含 left 和 right 两点(也就是 nums[left] + nums[left + 1] + ... + nums[right] ) 示例 1: 输入: ["NumArray", "sumRange", "sumRange", "sumRange"] [[[-2, 0, 3, -5, 2, -1]], [0, 2], [2, 5], [0, 5]] 输出: [null, 1, -1, -3] 解释: NumArray numArray = new NumArray([-2, 0, 3, -5, 2, -1]); numArray.sumRange(0, 2); // return 1 ((-2) + 0 + 3) numArray.sumRange(2, 5); // return -1 (3 + (-5) + 2 + (-1)) numArray.sumRange(0, 5); // return -3 ((-2) + 0 + 3 + (-5) + 2 + (-1)) 提示: 1 <= nums.length <= 104 -105 <= nums[i] <= 105 0 <= i <= j < nums.length 最多调用 104 次 sumRange 方法
时间: 2024-01-20 12:02:38 浏览: 68
kotlin-plugin-211-1.5.30-release-408-AS7442.40.zip
以下是使用 Kotlin 实现的解法:
```kotlin
class NumArray(nums: IntArray) {
private val prefixSum = IntArray(nums.size + 1)
init {
for (i in nums.indices) {
prefixSum[i + 1] = prefixSum[i] + nums[i]
}
}
fun sumRange(i: Int, j: Int): Int {
return prefixSum[j + 1] - prefixSum[i]
}
}
```
该算法使用前缀和的思想,首先构造一个前缀和数组 prefixSum,其中 prefixSum[i] 表示 nums 数组中前 i 个元素的和。然后,对于每个查询 [i, j],只需要计算 prefixSum[j + 1] - prefixSum[i] 即可得到区间和。
需要注意的是,为了方便计算,prefixSum 数组的长度比 nums 数组的长度多 1,且 prefixSum[0] 的值为 0。这样可以避免在计算 prefixSum[i + 1] 时出现数组下标越界的情况。
在 NumArray 类的构造函数中,我们遍历 nums 数组,依次计算 prefixSum 数组的每个元素的值。具体地,prefixSum[i + 1] 的值等于 prefixSum[i] 和 nums[i] 的和。
在 sumRange 方法中,我们使用前缀和计算出区间 [i, j] 的和。具体地,区间 [i, j] 的和等于 prefixSum[j + 1] 减去 prefixSum[i]。
阅读全文