LeetCode 327. Count of Range Sum 区间和的个数
给定一个整数数组 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 区间和的个数的更多相关文章
- [LeetCode] 327. Count of Range Sum 区间和计数
Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusive.Ra ...
- 【算法之美】你可能想不到的归并排序的神奇应用 — leetcode 327. Count of Range Sum
又是一道有意思的题目,Count of Range Sum.(PS:leetcode 我已经做了 190 道,欢迎围观全部题解 https://github.com/hanzichi/leetcode ...
- 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 ...
- 327 Count of Range Sum 区间和计数
Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusive.Ra ...
- LeetCode 327. Count of Range Sum
无意看到的LeetCode新题,不算太简单,大意是给一个数组,询问多少区间和在某个[L,R]之内.首先做出前缀和,将问题转为数组中多少A[j]-A[i] (j>i)在范围内. 有一种基于归并排序 ...
- 327. Count of Range Sum
/* * 327. Count of Range Sum * 2016-7-8 by Mingyang */ public int countRangeSum(int[] nums, int lowe ...
- [LeetCode] Count of Range Sum 区间和计数
Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusive.Ra ...
- 【LeetCode】327. Count of Range Sum
题目: Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusiv ...
- 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 ...
- LeetCode Count of Range Sum
原题链接在这里:https://leetcode.com/problems/count-of-range-sum/ 题目: Given an integer array nums, return th ...
随机推荐
- 在英特尔 Gaudi 2 上加速蛋白质语言模型 ProtST
引言 蛋白质语言模型 (Protein Language Models, PLM) 已成为蛋白质结构与功能预测及设计的有力工具.在 2023 年国际机器学习会议 (ICML) 上,MILA 和英特尔实 ...
- holiday week2
本周进度总结: 本周完成了小学期内容 LOL打了近20把,rank几乎不变 平均每天用6h+在编程学习上,更进一步了解了C++,我相信我有更进一步的编程水平,可以编写更多的东西 JAVA还没开始学 别 ...
- 题解 CF653F Paper task
CF653F Paper task 给定一个长度为 \(n\) 和括号串,求本质不同的合法括号串个数.\(n\le 5\times 10^5\). 考虑如果不是求本质不同,可以想到 DP. 设 \(f ...
- wandb原来是可以网络直连的,国内可以无障碍使用
一直不是很常使用神经网络训练可视化的工具,包括:tensorboard,等等,wandb平时也是直接就忽略,不过最近无意间看了看这个效果,感觉还是不错的,于是尝试了一下. 网上很多人说这个工具服务器在 ...
- 如何构建“集成神经网络”“Ensemble neural network”
参考: https://arxiv.org/pdf/1603.05691.pdf 本文要讨论的是如何构建"集成神经网络"("Ensemble neural network ...
- AI大模型 —— 国产大模型 —— 华为大模型
有这么一句话,那就是AI大模型分两种,一种是大模型:另一种是华为大模型. 如果从技术角度来分析,华为的技术不论是在软件还是硬件都比国外的大公司差距极大,甚至有些技术评论者认为华为的软硬件技术至少落后2 ...
- Java核心技术之Date相关
import java.time.DayOfWeek; import java.time.LocalDate; import java.util.Scanner; /** * @author Suns ...
- 数字名片工具 BBlog:使用一个链接,快速创建和分享你的信息主页和数字花园
数字名片 BBlog:使用一个链接,快速创建和分享你的信息主页和数字花园 随着移动互联网技术的快速发展,数字名片产品已成为现代社交和网络营销的重要工具.数字名片可以帮助个人和企业在各种场合中展示和分享 ...
- windows中好用的工具
windows中好用的工具和浏览器插件 一.geek卸载软件 软件介绍 geek一款非常简洁的卸载软件,并且非常强大,强大到可以清理注册表,用过的都说好. 下载地址: https://geekunin ...
- 什么是API?(详解)
编程资料时经常会看到API这个名词,网上各种高大上的解释估计放倒了一批初学者.初学者看到下面这一段话可能就有点头痛了. API(Application Programming Interface,应用 ...