[LeetCode]Count of Range Sum
题目: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 = -2
, upper = 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相关推荐
- Leetcode题目:Range Sum Query - Immutable
题目: Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclu ...
- 327. Count of Range Sum 区间和的个数
给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数,包含 lower 和 upper. 区间和 S(i, j) 表示在 nums 中,位置从 i 到 j 的元素之和,包 ...
- 数据结构线段树介绍与笔试算法题-LeetCode 307. Range Sum Query - Mutable--Java解法
此文首发于我的个人博客:zhang0peter的个人博客 LeetCode题解文章分类:LeetCode题解文章集合 LeetCode 所有题目总结:LeetCode 所有题目总结 线段树(Segme ...
- leetcode 304. Range Sum Query 2D - Immutable |304. 二维区域和检索 - 矩阵不可变(二维前缀和问题)
题目 https://leetcode.com/problems/range-sum-query-2d-immutable/ 题解 本题是 medium 难度,二维前缀和问题.相似题目有: Easy: ...
- 304. Range Sum Query 2D - Immutable
题目: Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper ...
- 【DP】LeetCode 64. Minimum Path Sum
LeetCode 64. Minimum Path Sum Solution1:标准的动态规划题目 class Solution { public:int minPathSum(vector<v ...
- LeetCode Count Complete Tree Nodes(二分法)
问题:给出一个完全二叉树,求其结点个数 思路:第一种方式时直接使用递归法,将其左子树个数加上右子树个数再加上根结点 第二种方式二分法,因为完全二叉树除了最后一层外,其它都满足有2^i个结点,而最后一层 ...
- select 1,select *,select count(),select sum(),select null
select 1 from dual where a >20 查询后返回1列,所返回的列值均为1,返回的行数等于满足条件的行数: 同理, select 常量 from - where -,查询后 ...
- SQL难点对比分析:COUNT(IF) 和 SUM(IF)的区别
COUNT(IF) 和 SUM(IF) 的区别和联系: COUNT(IF xxx, 1, 0):无视条件求和,即统计0或者1的数量(因为不论0还是1,都是不为NULL的值) SUM(xxx, 1, 0 ...
最新文章
- 20145228《Java程序设计》课程总结
- linux服务器无网络确认,Linux服务器故障排查实用指南
- SQL PROMPT5.3.4.1的一些设置选项
- HAproxy + Keepalive实现LDAP代理服务
- Qt实践录:TCP网络调试助手
- Jmeter数据库及接口测试
- .net,微软,薪资及其他
- Mxnet框架学习笔记(一):常用数据操作方法学习记录
- VM14安装CentOS7并配置网络
- 大众点评网根据关键词和城市id返回搜索结果-爬虫源码示例
- PHP excel导出 表格 ,带图片
- ubuntu禁用smap
- NVIDIA TX2 使能CAN模块
- 百度安卓开发一二面面经
- 【MATLAB】绘制阶梯图、枝干图
- ScriptEngineManager
- FDC2214/2114使用说明及资料分享
- SLAM系列——视觉里程计(特征法)
- Protege中使用OWLViz时,解决出现类堆叠在一起无法显示的问题
- 系统辨识(二):随机过程