有一个任务:用指定的方法创建一个类:
class NumArray {
public NumArray(int[] nums) {
//инициализация объекта с массивом интов
}
public void update(int index, int val) {
// изменить значение под индексом index на значение val
}
public int sumRange(int left, int right) {
//посчитать сумму между левым и правым индексом включительно
}
}
这似乎没有什么困难,但我以最明显的方式实现了它:
class NumArray {
int[] nums;
public NumArray(int[] nums) {
this.nums=nums;
}
public void update(int index, int val) {
nums[index]=val;
}
public int sumRange(int left, int right) {
int sum=0;
for(int i=left;i<=right;i++)
sum+=nums[i];
return sum;
}
}
该课程通过了 13/15 次检查,并且在 14 日当我收到大数组作为输入并且左右之间存在很大差异时,我没有通过检查 - 我不符合时间限制。我窥视了答案-人们组织了二叉树和其他“困难”。我不明白为什么?事实上,我的表格中的方法是尽可能快的吗?(更新是 O(1) - 不能更快地完成)和(sumRange 是 O(n) - 也不能更快地完成)。我哪里错了?提前致谢
总的来说,多亏了评论中的提示,我解决了这个问题。我使用了“段树”数据结构。确实,通过这个解决方案,我仍然没有摆脱 O(n) 的复杂性——在构建树时就是这样的复杂性。因此,当我们拥有一个源数组并对其进行许多操作时,此选项有助于提高速度。也就是说,一棵树以复杂度 O(n) 构建 1 次,然后所有操作都在对数时间内进行。多亏了这一点,我跳过了那些指定一个数组并对其进行多个方法调用的测试。实际上是类本身的实现,如果突然有人需要它:
谢谢大家的提示!