C++ 算法:区间和的个数

news2024/11/27 7:40:07

涉及知识点

归并排序

题目

给你一个整数数组 nums 以及两个整数 lower 和 upper 。求数组中,值位于范围 [lower, upper] (包含 lower 和 upper)之内的 区间和的个数 。
区间和 S(i, j) 表示在 nums 中,位置从 i 到 j 的元素之和,包含 i 和 j (i ≤ j)。
示例 1:
输入:nums = [-2,5,-1], lower = -2, upper = 2
输出:3
解释:存在三个区间:[0,0]、[2,2] 和 [0,2] ,对应的区间和分别是:-2 、-1 、2 。
示例 2:
输入:nums = [0], lower = 0, upper = 0
输出:1
参数范围
1 <= nums.length <= 105
-231 <= nums[i] <= 231 - 1
-105 <= lower <= upper <= 105
题目数据保证答案是一个 32 位 的整数

2023年3月版(树状数组)

template
class CTreeArr
{
public:
CTreeArr(int iSize) :m_vData(iSize+1)
{
}
void Add(int index, T value)
{
index++;
while (index < m_vData.size())
{
m_vData[index] += value;
index += index&(-index);
}
}
T Sum(int index)
{
index++;
T ret = 0;
while (index )
{
ret += m_vData[index];
index -= index&(-index);
}
return ret;
}
private:
vector m_vData;
};

class Solution {
public:
int countRangeSum(vector& nums, int lower, int upper) {
//std::multiset dp;
vector vCan;
long long llAdd = 0;
for (const auto& n : nums)
{
llAdd += n;
vCan.emplace_back(n - llAdd);
}
std::sort(vCan.begin(), vCan.end());
auto itEnd = std::unique(vCan.begin(), vCan.end());
vCan.erase(itEnd, vCan.end());
CTreeArr tree(vCan.size());
llAdd = 0;
long long iRet = 0;
for (const auto& n : nums)
{
llAdd += n;
const int iIndex = std::lower_bound(vCan.begin(), vCan.end(), (long long)n - llAdd) - vCan.begin();
tree.Add(iIndex, 1);
const int iBeginIndex = std::lower_bound(vCan.begin(), vCan.end(), (long long)lower - llAdd) - vCan.begin();
const int iEndIndex = std::lower_bound(vCan.begin(), vCan.end(), (long long)upper - llAdd+1) - vCan.begin();
if (0 == iEndIndex)
{
continue;
}
iRet += tree.Sum(iEndIndex - 1);
if (iBeginIndex > 0)
{
iRet -= tree.Sum(iBeginIndex - 1);
}
}

	 return iRet;
 }

};

2023年8月 归并排序版

class CCountRangeSum : public CMergeSortIndex
{
public:
CCountRangeSum(const vector& vPreSum,int lower, int upper):CMergeSortIndex(vPreSum)
{
m_iLower = lower;
m_iUpper = upper;
}
using CMergeSortIndex::CMergeSortIndex;
int m_iRet = 0;
protected:
virtual void OnSortLeftRightEnd(int left, int mid, int right)
{
int i2 = mid,i3=mid;
for (int i1 = left; i1 < mid; i1++)
{
while ((i2 < right) && (m_nums[m_vIndexs[i2]] - m_nums[m_vIndexs[i1]] < m_iLower))
{
i2++;
}
while ((i3 < right) && (m_nums[m_vIndexs[i3]] - m_nums[m_vIndexs[i1]] <= m_iUpper))
{
i3++;
}
m_iRet += i3 - i2;
}
}
int m_iLower ;
int m_iUpper ;
};
class Solution {
public:
int countRangeSum(vector& nums, int lower, int upper) {
vector vPreSum(1);
for (const auto& n : nums)
{
vPreSum.emplace_back(vPreSum.back() + n);
}
CCountRangeSum crs(vPreSum, lower, upper);
crs.Sort();
return crs.m_iRet;
}
};

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快

速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关下载

想高屋建瓴的学习算法,请下载《闻缺陷则喜算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

鄙人想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
墨家名称的来源:有所得以墨记之。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境:

VS2022 C++17

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1170388.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多技术融合提升环境、生态、水文、土地、农业、大气等领域科研技术水平

专题一、空间数据获取与制图 1.1 软件安装与应用讲解 1.2 空间数据介绍 1.3海量空间数据下载 1.4 ArcGIS软件快速入门 1.5 Geodatabase地理数据库 点击查看原文链接https://mp.weixin.qq.com/s?__bizMzg2NDYxNjMyNA&mid2247546998&idx6&sn39342c376b158eff1…

基于SSM的购物商城网站的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

多测师肖sir_高级金牌讲师__adb命令

adb指令整理&#xff1a; ADB常用的指令&#xff1a; 查看当前连接设备 &#xff1a; adb devices 进入到shell &#xff1a; adb shell 查看日志 &#xff1a; adb logcat 安装apk文件 &#xff1a; adb install xxx.apk 卸载APP &#xff1a; adb uninstall 包名 查看包名 &…

Cadence Virtuoso如何保存spectre仿真在cell view里

Launch ADE L 可以选择 Load State 加载上次仿真状态&#xff0c;但是我想保存在cell view和schematic在一起可以直接打开&#xff0c;可以选择Save State旁的Cellview 可以在Library Manager中看到保存成功了

YOLOv5项目实战(2)— 手把手教你租借云服务器去训练模型

前言:Hello大家好,我是小哥谈。近期由于出差在外(在新疆吐鲁番出差呢~),一直远程使用公司服务器进行算法模型训练,但是由于这几天公司VPN故障,导致无法远程训练模型,所以就想着租借服务器来进行训练。近期我研发的算法模型是工业场景烟雾明火检测,本节课就以此为例教大…

AI 引擎系列 4 - 首次运行 AI 引擎编译器和 x86simulator(2022.1 更新)

AI 引擎系列 4 - 首次运行 AI 引擎编译器和 x86simulator&#xff08;2022.1 更新&#xff09; 简介 在 AI 引擎系列的前 3 篇博文中&#xff0c;我们探讨了 AI 引擎应用所需的不同文件。在本篇中&#xff0c;我们将为 X86 目标运行 AI 引擎编译器&#xff0c;观察它生成的不…

YOLO目标检测——昏暗车辆检测数据集【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;智能交通监控系统、驾驶辅助系统、城市安全监控、自动驾驶系统以及路况分析与规划等数据集说明&#xff1a;昏暗车辆检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富&#xff0c;含有图片汽车、卡车、公共汽车标签说明&#…

C++23:多维视图(std::mdspan)

C23&#xff1a;多维视图&#xff08;std::mdspan&#xff09; 介绍 在 C23 中&#xff0c;std::mdspan 是一个非拥有的多维视图&#xff0c;用于表示连续对象序列。这个连续对象序列可以是一个简单的 C 数组、带有大小的指针、std::array、std::vector 或 std::string。 这…

YOLO目标检测——车辆分类检测数据集【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;安全监控、智能驾驶、人机交互、智能城市数据集说明&#xff1a;车辆分类检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富&#xff0c;含有图片汽车、公共汽车、摩托车、救护车和卡车等图片标签说明&#xff1a;使用lableimg…

SPSS两相关样本检验

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件请点击此链接下…

LED点阵显示原理(取字模软件+Keil+Proteus)

前言 写这个的时候我还是有点生气的&#xff0c;因为发现完全按照书上面的步骤来&#xff0c;结果发现不理想&#xff0c;后面还是自己调试才解决了。-_-说多了都是泪&#xff0c;直接进入正文。 软件的操作还是参考我之前的博客。 LED数码管的静态显示与动态显示&#xff0…

nvm 下载 nodejs 速度慢问题解决

1、找到 nvm 的下载目录&#xff0c;在目录下找到 settings.txt 文件 2、打开 settings.txt 文件 &#xff0c;添加以下代码&#xff1a; node_mirror: https://npm.taobao.org/mirrors/node/ npm_mirror: https://npm.taobao.org/mirrors/npm/添加完成后再去下载即可。

sed 原地替换文件时遇到的趣事

哈喽大家好&#xff0c;我是咸鱼 在文章《三剑客之 sed》中咸鱼向大家介绍了文本三剑客中的 sed sed 全名叫 stream editor&#xff0c;流编辑器&#xff0c;用程序的方式来编辑文本 那么今天咸鱼打算讲一下我在用 sed 原地替换文件时遇到的趣事 sed 让文件属性变了&#xff…

故障诊断模型 | Maltab实现BP神经网络的故障诊断

文章目录 效果一览文章概述模型描述源码设计参考资料效果一览 文章概述 故障诊断模型 | Maltab实现BP神经网络的故障诊断 模型描述 BP(Back Propagation) 算法是神经网络深度学习中最重要的算法之一,了解BP算法可以让我们更理解神经网络深度学习模型训练的本质,属于内功修行的…

什么叫储能能量管理单元EMU?储能能量管理单元EMU功能?储能EMU是什么?储能能量管理系统如何实现一次调频AGC-AVC功能?

一&#xff1a;储能EMU是什么意思?什么叫储能能量管理单元EMU&#xff1f; EMU是能量管理单元的英文缩写 (Energy Management Unit, EMU) EmuPower3300能量管理单元EMU是由广州智昊电气研发配套EsccPower3300储能协调管理器组成对光伏电站的管理&#xff0c;控制&#xff0c;…

Java随机获取某个范围内的随机整数

随机获取某个范围内的随机整数 一、代码 /*** 随机获取某个范围内的随机整数的值* param min 最小值* param max 最大值* return*/public static int randomNum(int min,int max) {// 创建一个Random对象Random random new Random();// 生成指定范围内的随机整数int randomI…

【Linux】 passwd命令使用

passwd命令用来更改使用者的密码。 语法 passwd [选项] [用户名] passwd命令 -Linux手册页 著者 克里斯蒂安加夫顿<gaftonredhat.com> 命令选项及作用 执行令 passwd --help 执行命令结果 参数 -k, --keep-tokens 保持身份验证令牌不过期-d, --delete …

超详细docker学习笔记

关于docker 一、基本概念什么是docker?docker组件&#xff1a;我们能用docker做什么Docker与配置管理&#xff1a;Docker的技术组件Docker资源Docker与虚拟机对比 二、安装docker三、镜像命令启动命令帮助命令列出本地主机上的镜像在远程仓库中搜索镜像查看占据的空间删除镜像…

Lustre文件系统介绍

一、什么是Lustre文件系统 Lustre架构是用于集群的存储架构。Lustre架构的核心组件是Lustre文件系统&#xff0c;它在Linux操作系统上得到支持&#xff0c;并提供了一个符合POSIX *标准的UNIX文件系统接口。 Lustre存储架构用于许多不同类型的集群。它以支持世界上许多最大的…

【Java】智慧校园云SaaS平台源码带微信小程序

智慧校园以互联网为基础&#xff0c;以“大数据云服务”为核心&#xff0c;融合校园教学、管理、生活软硬件平台&#xff0c;定义智慧校园新生活。智慧校园管理平台管理者、教师、学生、家长提供一站式智慧校园解决方案&#xff0c;实现校园管理智能化、校园生活一体化、校园设…