题目:Count of Range Sum

Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusive.
Range sum S(i, j) is defined as the sum of the elements in nums between indices i and j (i ≤ j), inclusive.

Note:
A naive algorithm of O(n2) is trivial. You MUST do better than that.

Example:
Given nums = [-2, 5, -1]lower = -2upper = 2,
Return 3.
The three ranges are : [0, 0][2, 2][0, 2] and their respective sums are: -2, -1, 2.

题意:

给定一个整数数组和一个范围,找到该数组的子集(要求子集是数组中连续的数)中满足子集元素的和在给定范围内的所有子集的个数。

分析:

正常的思路,需要找数组的不同的子集,复杂度为O(n^2)。

/**
动态规划:S[i][j]表示nums中从i到j的和
S[i][j] = S[i][j - 1] + nums[j]
**/
int LeetCode::countRangeSum(vector<int>& nums, int lower, int upper){int n = nums.size();vector<vector<int>> sum(n,vector<int>(n, 0));int count = 0;for (size_t i = 0; i < n; i++){sum[i][i] = nums[i];if (sum[i][i] >= lower && sum[i][i] <= upper)++count;}for (size_t i = 0; i < n; i++){for (size_t j = i + 1; j < n; j++){sum[i][j] = sum[i][j - 1] + nums[j];if (sum[i][j] >= lower && sum[i][j] <= upper)++count;}}return count;
}

但是,它可以在O(nlogn)的复杂度中完成。

设S(n)表示前n个元素的和,SubSet(i,j)表示数组i到j的子集的和;给定的范围是[low,up];

则简单来讲,要找满足low<=SubSet(i,j)<=up的SubSet的个数。

SubSet(i,j) = S(j) - S(i);也就是要求low<=S(j) - S(i)<=up中ij的个数。

这是可以看出必然需要一个辅助数组保存前n个元素的和;

简化要求来思考:当访问到新的元素j时,得到前j项和,则此时如果是只需求以j为终点的子集中满足题目要求的和的子集个数该怎么求呢?

只需要遍历前j-1个前n项和然后用S(j)-S(k),判断是否在范围内即可;

进一步,如果前j-1个前n项和是有序的,就只要找到第一个满足下界和最后一个满足上界的,然后他们之间包含多少个元素就有多少个满足要求的子集。

这样就要求按大小顺序来存储前n项和,而且可以使用lower_bound()和upper_bound()函数来确定范围,于是就可以想到用multiset来存储前n项和。

那么要找到所有的数组中子集满足条件的个数,就需要将上面求的每个位置的子集的数量加起来即可。

/**
一个基本的想法是使用multiset保存前i个元素的和.因为set是有序的可重复的容器.
当前位置为i时的满足给定范围的序列应该是:lower=< sum[i]-sum[j]<= upper.它对应的范围是[j,i].
所以只需要计算j的个数:使得j (0=< j< i) 满足 sum[i]-upper=< sum[j]<= sum[i]-lower.
STL提供的函数upper_bound, lower_bound能够快速找到这样的j的范围,因为set有序范围内的一定满足上面的条件.
set使用红黑树来实现,因此上面的操作时间复杂度O(logN).
所以总的时间复杂度为O(NlogN).
**/
int LeetCode::countRangeSum(vector<int>& nums, int lower, int upper){multiset<long long>sums;//注意使用long long防止溢出long long sum = 0L;int result = 0;sums.insert(0);//插入第0个和for (size_t i = 0; i < nums.size(); i++){sum += nums[i];result += distance(sums.lower_bound(sum - upper), sums.upper_bound(sum - lower));//找到满足sum[i]-upper=< sum[j]<= sum[i]-lower的范围
        sums.insert(sum);}return result;
}

转载于:https://www.cnblogs.com/yeqluofwupheng/p/6959377.html

[LeetCode]Count of Range Sum相关推荐

  1. Leetcode题目:Range Sum Query - Immutable

    题目: Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclu ...

  2. 327. Count of Range Sum 区间和的个数

    给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数,包含 lower 和 upper. 区间和 S(i, j) 表示在 nums 中,位置从 i 到 j 的元素之和,包 ...

  3. 数据结构线段树介绍与笔试算法题-LeetCode 307. Range Sum Query - Mutable--Java解法

    此文首发于我的个人博客:zhang0peter的个人博客 LeetCode题解文章分类:LeetCode题解文章集合 LeetCode 所有题目总结:LeetCode 所有题目总结 线段树(Segme ...

  4. leetcode 304. Range Sum Query 2D - Immutable |304. 二维区域和检索 - 矩阵不可变(二维前缀和问题)

    题目 https://leetcode.com/problems/range-sum-query-2d-immutable/ 题解 本题是 medium 难度,二维前缀和问题.相似题目有: Easy: ...

  5. 304. Range Sum Query 2D - Immutable

    题目: Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper ...

  6. 【DP】LeetCode 64. Minimum Path Sum

    LeetCode 64. Minimum Path Sum Solution1:标准的动态规划题目 class Solution { public:int minPathSum(vector<v ...

  7. LeetCode Count Complete Tree Nodes(二分法)

    问题:给出一个完全二叉树,求其结点个数 思路:第一种方式时直接使用递归法,将其左子树个数加上右子树个数再加上根结点 第二种方式二分法,因为完全二叉树除了最后一层外,其它都满足有2^i个结点,而最后一层 ...

  8. select 1,select *,select count(),select sum(),select null

    select 1 from dual where a >20 查询后返回1列,所返回的列值均为1,返回的行数等于满足条件的行数: 同理, select 常量 from - where -,查询后 ...

  9. SQL难点对比分析:COUNT(IF) 和 SUM(IF)的区别

    COUNT(IF) 和 SUM(IF) 的区别和联系: COUNT(IF xxx, 1, 0):无视条件求和,即统计0或者1的数量(因为不论0还是1,都是不为NULL的值) SUM(xxx, 1, 0 ...

最新文章

  1. 20145228《Java程序设计》课程总结
  2. linux服务器无网络确认,Linux服务器故障排查实用指南
  3. SQL PROMPT5.3.4.1的一些设置选项
  4. HAproxy + Keepalive实现LDAP代理服务
  5. Qt实践录:TCP网络调试助手
  6. Jmeter数据库及接口测试
  7. .net,微软,薪资及其他
  8. Mxnet框架学习笔记(一):常用数据操作方法学习记录
  9. VM14安装CentOS7并配置网络
  10. 大众点评网根据关键词和城市id返回搜索结果-爬虫源码示例
  11. PHP excel导出 表格 ,带图片
  12. ubuntu禁用smap
  13. NVIDIA TX2 使能CAN模块
  14. 百度安卓开发一二面面经
  15. 【MATLAB】绘制阶梯图、枝干图
  16. ScriptEngineManager
  17. FDC2214/2114使用说明及资料分享
  18. SLAM系列——视觉里程计(特征法)
  19. Protege中使用OWLViz时,解决出现类堆叠在一起无法显示的问题
  20. 系统辨识(二):随机过程

热门文章

  1. vs自定义安装包的制作
  2. 不吹不黑,赞一下应用运维管理的cassacdra
  3. [游戏模版18] Win32 五子棋
  4. MySQL学习笔记_7_MySQL常用内置函数
  5. 里氏替换原则→类型转换
  6. 21天学通c++之7.10 for 循环 初始化多个变量
  7. 梁建章的多米诺,混合办公的未知数
  8. 埋点、数仓到中台:数据体系的从0到1
  9. PMCAFF专栏作者招募计划
  10. PMCAFF高端俱乐部首次集结,最顶级产品人的私密俱乐部!