这些题有点像实现一个数组的函数操作,比如给一个数组,实现一个函数可以求解数组任意长度上的和,要求时间复杂度为O(1),然后如果是更新数组的话,再求和该如何实现呢?
Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive.
Example:1234Given nums = [-2, 0, 3, -5, 2, -1]sumRange(0, 2) -> 1sumRange(2, 5) -> -1sumRange(0, 5) -> -3Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper left corner (row1, col1) and lower right corner (row2, col2).
Example:12345678910Given matrix = [[3, 0, 1, 4, 2],[5, 6, 3, 2, 1],[1, 2, 0, 1, 5],[4, 1, 0, 1, 7],[1, 0, 3, 0, 5]]sumRegion(2, 1, 4, 3) -> 8sumRegion(1, 1, 2, 2) -> 11sumRegion(1, 2, 2, 4) -> 12Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive.
The update(i, val) function modifies nums by updating the element at index i to val.12345Example:Given nums = [1, 3, 5]sumRange(0, 2) -> 9update(1, 2)sumRange(0, 2) -> 8
[leetcode 303] Range Sum Query - Immutable
这个就非常简单了,属于easy的题目,对i遍历,将i前面的数全部加上即可。
[leetcode 304] Range Sum Query 2D - Immutable
同上道题的原理,也非常简单,对每一行求和。
[leetcode 307] Range Sum Query - Mutable
其实我主要是想说这道题,我继续上面的方法,哗哗哗的写了下面这个代码:
我看着update确实有点复杂呢,leetcode上submit后超时了,最后一个test没有过,然后看了看discuss上第一的解法,一个感叹啊,总是让人惊奇,使用的是分割树,至少是将update函数时间复杂度从O(n)降到了O(lgn),但是sunRange函数却是O(lgn),也就是2O(lgn)和O(n)的区别,我只是觉得方法很好,佩服佩服,我就不会利用这些学过的知识,或许太急功近利了吧…