中级农民
- 积分
- 113
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2012-8-24
- 最后登录
- 1970-1-1
|
借地求助一下代码问题……下面是我第一遍刷题的时候,最后看了答案写的code但是现在看不大懂了。
主要就是终止条件的地方。因为那个helper function就是数[left,right]内有多少符合条件的range,于是到最后如果 left==right,说明range内只有一个数,这样不应该比较这个数和lower还有upper的关系吗?为什么比较的是rangeSum[left]呢,这个是[0,left]的和呀……这样就把这个range数进来了,而不是[left,right]这个range了……
但是这个code还可以过OJ……
leetcode discuss里也有不少是这样写的,但是都没解释……
各路大神帮忙看一下……谢谢!!!
- vector<long> rangeSum;
- int countRangeSum(vector<int>& nums, int lower, int upper) {
- if (nums.size()==0) return 0;
- size_t n = nums.size();
- rangeSum.resize(n, 0);
- long sum = 0;
- for (int i = 0; i < n; i++) {
- sum += nums[i];
- rangeSum[i] = sum;
- }
- int result = searchRange(0, n-1, lower, upper);
- return result;
- }
-
- long getSum(int i, int j) {
- return rangeSum[j]-rangeSum[i];
- }
-
- int searchRange(int left, int right, int lower, int upper) {
- if (left == right) return (rangeSum[left]>=lower&&rangeSum[left]<=upper);
- int mid = (left+right)/2;
- int count = searchRange(left, mid, lower, upper) + searchRange(mid+1, right, lower, upper);
- int k = mid+1, j = mid+1;
- for (int i = left; i <= mid; i++) {
- while(j<=right && getSum(i,j)<lower) j++;
- while(k<=right && getSum(i,k)<=upper) k++;
- count += k-j;
- }
- inplace_merge(rangeSum.begin()+left, rangeSum.begin()+mid+1, rangeSum.begin()+right+1);
- return count;
- }
复制代码 |
|