解题报告:区间求和 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);//左右之间都有
	}
};

手把手教你编写智能合约(Smart Contract)

1、开发环境Atom配置 2、ethereumjs-testrpc、 truffle安装 3、智能合约项目创建 4、编译 5、部署 6、通过JS代码调用智能合约方法
  • 2017年09月20日 09:46

(线段树) 简单 区间求和

//区间求和 getsum() 函数,与区间最小值不同的是,建树的时候区间最小值数组里面存放的是最小项,而求和是建树数组里面存放的是子树和,还有pushdown()函数传递的时候,val的数值要跟着变...
  • huihui1094667985
  • huihui1094667985
  • 2017-04-19 08:46:21
  • 249

LintCode:区间求和 II

LintCode:区间求和 II class SegmentTreeNode { public int start, end; long max; public ...
  • u012225151
  • u012225151
  • 2016-08-13 17:44:35
  • 340

区间统计求和

表的结构如下: id1     id2 206 18875035853 200 18783085638 200 18288745129 200 15829093718 200 157382...
  • huangliang0703
  • huangliang0703
  • 2017-03-13 19:38:07
  • 285

LintCode:区间求和

LintCode:区间求和暴力求解,超时。。。""" Definition of Interval. class Interval(object): def __init__(self, st...
  • u012225151
  • u012225151
  • 2016-08-13 00:10:37
  • 351

区间求和 II -LintCode

在类的构造函数中给一个整数数组, 实现两个方法 query(start, end) 和 modify(index, value):对于 query(start, end), 返回数组中下标 start...
  • zhaohengchuan
  • zhaohengchuan
  • 2017-09-13 17:26:49
  • 55

区间求和

给定一个整数数组(下标由 0 到 n-1,其中 n 表示数组的规模),以及一个查询列表。每一个查询列表有两个整数[start, end] 。 对于每个查询,计算出数组中从下标 start 到 end...
  • gettogetto
  • gettogetto
  • 2015-10-13 10:10:43
  • 201

LintCode-二进制求和

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和...
  • xiaowei132
  • xiaowei132
  • 2015-08-26 15:34:16
  • 325

hdu 1166 敌兵布阵 (线段树单点更新)

敌兵布阵                                                         Time Limit: 2000/1000 MS (Java/Others)...
  • CriminalCode
  • CriminalCode
  • 2015-08-13 14:07:53
  • 417

(lintcode)第20题 骰子求和

要求:扔 n 个骰子,向上面的数字之和为 S。给定 Given n,请列出所有可能的 S 值及其相应的概率。 样例 给定 n = 1,返回 [ [1, 0.17], [2, 0.17]...
  • Aphysia
  • Aphysia
  • 2017-09-05 22:15:56
  • 1179
收藏助手
不良信息举报
您举报文章:解题报告:区间求和 I
举报原因:
原因补充:

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