暴力解法要有两层循环,造成复杂度为 O(N2) ,造成这样的主要原因是重复计算,部分的计算结果没有保留。 记 s(i,j) 为要求的值,不难发现 s(i,j)=s(0,j)−s(0,i−1) ,这样的话我们只需要保存一个长度为n的数值,保存 s(0,i) 的值即可。
public class NumArray { int[] partSum; public NumArray(int[] nums) { if(nums!=null && nums.length >= 1){ int len = nums.length; partSum = new int[len]; partSum[0] = nums[0]; for(int i=1; i<len; i++){ partSum[i] = partSum[i-1] + nums[i]; } } } public int sumRange(int i, int j) { if(partSum==null || partSum.length==0) return 0; if(i==0) return partSum[j]; return partSum[j] - partSum[i-1]; } }Top的的写法
public class NumArray { private int[] sums; public NumArray(int[] nums) { if(nums.length != 0){ sums = new int[nums.length]; sums[0] = nums[0]; for(int i=1; i<nums.length; i++){ sums[i] = nums[i] + sums[i-1]; } } } public int sumRange(int i, int j) { return i==0 ? sums[j] : sums[j]-sums[i-1]; } }