解题报告:区间求和 I

原创 2015年07月09日 17:33:12
http://www.lintcode.com/zh-cn/problem/interval-sum/
/**
 * Definition of Interval:
 * classs Interval {
 *     int start, end;
 *     Interval(int start, int end) {
 *         this->start = start;
 *         this->end = end;
 *     }
 */
 
class Solution { 
public:
    /**
     *@param A, queries: Given an integer array and an query list
     *@return: The result list
     */
    	vector<long long> intervalSum(vector<int> &A, vector<Interval> &queries) {
		// write your code here
		SegmentTreeNode * root = build(0, A.size() - 1, A);

		vector<long long>  d;
		for (int i = 0; i<queries.size(); i++){
			d.push_back(query(root, queries[i].start, queries[i].end));
		}
		return d;
	}
    SegmentTreeNode * build(int start, int end, vector<int> &A) {
		// write your code here
		if (start>end)return NULL;
		int mid = start + (end - start) / 2;
		if (start  == end)return new SegmentTreeNode(start, end, A[start] );
		SegmentTreeNode *left = build(start, mid, A);
		SegmentTreeNode *right = build(mid + 1, end, A);
		SegmentTreeNode *stn = new SegmentTreeNode(start, end, left->max + right->max);
		stn->left = left;
		stn->right = right;
		return stn;
	}
 unsigned int query(SegmentTreeNode *root, int start, int end) {
		// write your code here
		if (root == nullptr)return 0;
		SegmentTreeNode *left = root->left, *right = root->right;
		if (end<root->start)return 0;//end超出了最左
		if (start>root->end)return 0;//start超出了最右
		if (start<root->start)start = left->start;//start超出了最左
		if (end>root->end)end = right->end;//end超出了最右
		if (start == root->start&&end == root->end)return root->max;
		if (left->end >= end){//完全左侧
			return query(left, start, end);
		}
		if (right->start <= start){//完全右侧
			return query(right, start, end);
		}
		return  query(left, start, left->end)+query(right, right->start, end);//左右之间都有
	}
};

lintcode-区间求和I-206

/** * Definition of Interval: * public classs Interval { * int start, end; * Interval(in...

团体程序设计天梯赛-练习集 L1-009. N个数求和 解题报告

题目链接https://www.patest.cn/contests/gplt/L1-009 L1-009. N个数求和 本题的要求很简单,就是求N个数字的和。麻烦的是,这...

LeetCode解题报告--2Sum, 3Sum, 4Sum, K Sum求和问题总结

前言: 这几天在做LeetCode 里面有2sum, 3sum(closest), 4sum等问题, 这类问题是典型的递归思路解题,该这类问题的关键在于,在进行求和求解前,要先排序Arrays.so...

Leetcode #40. Combination Sum II 组合求和2 解题报告

1 解题思想这道题是昨天的升级版,先看看这个 Leetcode #39. Combination Sum 组合求和 解题报告这道题的改变就是每个位置的数只能用一次了,但是如果本身就给了多个的话就无...
  • MebiuW
  • MebiuW
  • 2016年04月11日 23:57
  • 528

团体程序设计天梯赛-练习集 L1-009. N个数求和 重载+运算符 解题报告

L1-009. N个数求和 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 ...

蓝桥杯 历届试题 连号区间数 解题报告

问题描述 小明这些天一直在思考这样一个奇怪而有趣的问题: 在1~N的某个全排列中有多少个连号区间呢?这里所说的连号区间的定义是: 如果区间[L, R] 里的所有元素(即此排列的第L个到第R个元...

poj 2689解题报告(区间筛素数,经典)

 Prime DistanceTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 4814 Accepted: 1282Descript...

Leetcode 435. Non-overlapping Intervals 无交叉覆盖区间 解题报告

1 解题思想题目给了一堆区间[起始位置,结束位置] 这些区间可能会有一些交叠的地方(边界相邻不算),现在要求找到一个方法,可以做最少的删除动作,使得剩下的区间都不交叉覆盖,返回那个需要删除的最少次数...
  • MebiuW
  • MebiuW
  • 2016年11月06日 14:48
  • 1748

NOIP 2007矩阵取数游戏 解题报告(区间型DP)

在线评测: http://codevs.cn/problem/1166/ (为了便于书写,以下内容不含高精度,包括AC代码,(简洁,更易理解)) 整体思路: 还是感觉记忆化...

POJ1089解题报告 区间合并

IntervalsTime Limit: 1000MS Memory Limit: 10000KTotal Submissions: 5345 Accepted: 2087DescriptionThe...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:解题报告:区间求和 I
举报原因:
原因补充:

(最多只允许输入30个字)