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

思路:

首先用 sum(i) 表示 nums[0]~nums[i] 的和,然后分别对于每个数 i ( 0 <= i < n ) 求出以 i 为起始位置的符合条件的区间个数。

当 sum[j] - sum[i-1] 在 [lower, upper] 之间时,证明 [i, j] 是一个合法区间。

开始以为使用二分求出sum中符合lower和upper条件的位置即可。

不过发现没有数据为正数的条件,也就是说 sum 并不是递增的,无法使用二分,那么可以考虑使用 multiset 进行维护即可。

注意数据范围 要使用 long long

代码:

class Solution {
public:
int countRangeSum(vector<int>& nums, int lower, int upper) {
int n = nums.size();
if (n == 0) return 0;
multiset<long long> mst;
long long sum = 0;
int res = 0; for (int i = 0; i < n; i++) {
mst.insert(sum);
sum += nums[i];
res += distance(mst.lower_bound(sum - upper), mst.upper_bound(sum - lower));
}
return res;
}
};

搜了下题解发现也有不依赖STL的做法,使用归并排序分治解决问题。

因为归并排序的时候,会将数组分为两部分,每部分排好序之后,再进行归并。

对于此题来说,合法区间有三种情况,一种是在左区间,一种是右区间,还有一种是横跨左右区间。

只在一个区间的情况,在递归解决子区间的时候,就已经算好了,而对于横跨的情况,既然已经排好序了,直接进行二分查找就可以了。

原地merge不能使用merge而要用 inplace_merge 我确实是第一次知道,debug好久 =。=

typedef long long ll;

class Solution {
public:
int countRangeSum(vector<int>& nums, int lower, int upper) {
int n = nums.size();
if (n == 0) return 0;
vector<ll> sum(n+1, 0);
for (int i = 0; i < n; i++) {
sum[i+1] = sum[i] + nums[i];
}
return countRangeSum(sum, lower, upper, 0, n + 1);
}
int countRangeSum(vector<ll>& sum, int lower, int upper, int left, int right) {
if (left + 1 >= right) return 0;
int res = 0;
int mid = (right + left) >> 1;
res += countRangeSum(sum, lower, upper, left, mid) + countRangeSum(sum, lower, upper, mid, right);
for (int i = left; i < mid; i++) {
res += distance(lower_bound(sum.begin() + mid, sum.begin() + right, sum[i] + lower),
upper_bound(sum.begin() + mid, sum.begin() + right, sum[i] + upper));
}
inplace_merge(sum.begin()+left, sum.begin()+mid, sum.begin()+right);
// merge(sum.begin() + left, sum.begin() + mid, sum.begin() + mid, sum.begin() + right, sum.begin() + left);
return res;
}
};

LeetCode 327. Count of Range Sum 区间和的个数的更多相关文章

  1. [LeetCode] 327. Count of Range Sum 区间和计数

    Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusive.Ra ...

  2. 【算法之美】你可能想不到的归并排序的神奇应用 — leetcode 327. Count of Range Sum

    又是一道有意思的题目,Count of Range Sum.(PS:leetcode 我已经做了 190 道,欢迎围观全部题解 https://github.com/hanzichi/leetcode ...

  3. leetcode@ [327] Count of Range Sum (Binary Search)

    https://leetcode.com/problems/count-of-range-sum/ Given an integer array nums, return the number of ...

  4. 327 Count of Range Sum 区间和计数

    Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusive.Ra ...

  5. LeetCode 327. Count of Range Sum

    无意看到的LeetCode新题,不算太简单,大意是给一个数组,询问多少区间和在某个[L,R]之内.首先做出前缀和,将问题转为数组中多少A[j]-A[i] (j>i)在范围内. 有一种基于归并排序 ...

  6. 327. Count of Range Sum

    /* * 327. Count of Range Sum * 2016-7-8 by Mingyang */ public int countRangeSum(int[] nums, int lowe ...

  7. [LeetCode] Count of Range Sum 区间和计数

    Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusive.Ra ...

  8. 【LeetCode】327. Count of Range Sum

    题目: Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusiv ...

  9. 327. Count of Range Sum(inplace_marge)

    Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusive.Ra ...

  10. LeetCode Count of Range Sum

    原题链接在这里:https://leetcode.com/problems/count-of-range-sum/ 题目: Given an integer array nums, return th ...

随机推荐

  1. CF941

    A link 其实,只要有第一次,那么下次随意找一个队列里有的数加\(k-1\)个进去,加上队列里那一个删掉\(k\)个,到最后一次肯定是剩\(k-1\)个. 没有第一次,就是\(n\). 点击查看代 ...

  2. Python版WGCNA分析和蛋白质相互作用PPI分析教程

    在前面的教程中,我们介绍了使用omicverse完成基本的RNA-seq的分析流程,在本节教程中,我们将介绍如何使用omicverse完成加权基因共表达网络分析WGCNA以及蛋白质相互作用PPI分析. ...

  3. windows server dhcp与AD域

    创建两台windows server 2016 同一个网络适配器 windows1 配置window1手动网络 安装域 设置密码下一步下一步 重启 完成域安装后创建用户 配置windows1 dhcp ...

  4. Python示例——负数的位运算

    平时在coding的时候虽然会遇到位运算但一般也都是正数的位运算,今天突然见到了使用负数的位运算,对此十分好奇和困惑,为此做了下了解,于是有了此文. 给出一些位运算的例子: 其中,正数的位运算是最为常 ...

  5. WhaleStudio 分钟级构建 AI 模型,强大 Ops 能力简化模型调度与部署

    什么是机器学习(ML)? 它有什么作用 机器学习(ML)是人工智能(AI)的一个子集,通过算法发现数据中的通用模式,并根据持续不断的训练来优化调整最终结果.ML模型从过去的经验中学习,并根据已有的经验 ...

  6. 运维 + AI,你得先搞懂这些

    很感谢夜莺提供如此优质的平台能和行业内顶尖技术大佬做面对面的交流,在这个会议中又学习到了很多有趣有深度的内容,给我在未来探索的道路上提供了一些新的指引方向.同时感谢夜莺社区的邀请,在此再做一次关于AI ...

  7. Ambiguous Mapping 的处理方法

    出现原因:两个不同的Controller 中出现相同映射路径 eg: AController:/v1/wdnmd/userList/list BController:/v1/wdnmd/userLis ...

  8. 一次生产环境mysql迁移操作(一)数据归档

    一次生产环境mysql迁移操作(一)数据归档 一次生产环境mysql迁移操作(二)mysql空间释放(碎片整理) 背景 在项目过程中我们经常要对数据库进行迁移.归档.拆分等等操作,现在描述下几种方案 ...

  9. flex数据绑定

    1 .方法绑定    [Bindable(event="myFlagChanged")] private function isEnabled():String { if (myF ...

  10. MPTCP(一) :MPTCP概览

    MPTCP概览 参考链接 MPTCP官网 http://multipath-tcp.org/ MPTCP入门 https://access.redhat.com/documentation/zh-cn ...