【C++二分查找 】1477. 找两个和为目标值且不重叠的子数组

news2024/9/21 16:37:03

本文涉及的基础知识点

C++二分查找
C++算法:滑动窗口总结
C++算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频

LeetCode1477. 找两个和为目标值且不重叠的子数组

给你一个整数数组 arr 和一个整数值 target 。
请你在 arr 中找 两个互不重叠的子数组 且它们的和都等于 target 。可能会有多种方案,请你返回满足要求的两个子数组长度和的 最小值 。
请返回满足要求的最小长度和,如果无法找到这样的两个子数组,请返回 -1 。
示例 1:
输入:arr = [3,2,2,4,3], target = 3
输出:2
解释:只有两个子数组和为 3 ([3] 和 [3])。它们的长度和为 2 。
示例 2:
输入:arr = [7,3,4,7], target = 7
输出:2
解释:尽管我们有 3 个互不重叠的子数组和为 7 ([7], [3,4] 和 [7]),但我们会选择第一个和第三个子数组,因为它们的长度和 2 是最小值。
示例 3:
输入:arr = [4,3,2,6,2,3,4], target = 6
输出:-1
解释:我们只有一个和为 6 的子数组。
示例 4:
输入:arr = [5,5,4,4,5], target = 3
输出:-1
解释:我们无法找到和为 3 的子数组。
示例 5:
输入:arr = [3,1,1,1,5,1,2,1], target = 3
输出:3
解释:注意子数组 [1,2] 和 [2,1] 不能成为一个方案因为它们重叠了。
提示:
1 <= arr.length <= 105
1 <= arr[i] <= 1000
1 <= target <= 108

二分查找

一,计算前缀和。
二,枚举所有和为target的子数组v,每个元素记录[开始,长度]。方法a:滑动窗口,时间复杂度O(n)。方法b:二分查找,前缀和,枚举right。时间复杂度:O(nlogn)。由于arr[i]>0,所以如果[l1,r1][l2,r2]符合,且r1 == r2,则l1 == l2。
三,枚举v中各元素,iMin记录当前元素之前的元素的最小元素长度。ret = min(ret,iMin+当前元素长度)。滑动窗口v[0…j-1]是所有和v[i]不重叠且在其左边的子数组。

代码

核心代码

class Solution {
		public:
			int minSumOfLengths(vector<int>& arr, int target) {
				vector<int> preSum(1);
				for (const auto& n : arr) {
					preSum.emplace_back(n + preSum.back());
				}
				vector<pair<int, int>> v;
				for (int i = 0; i < arr.size(); i++) {
					auto it = std::equal_range(preSum.begin(), preSum.end(), preSum[i+1] - target);
					const int len = it.second - it.first;
					if (1 == len ) {
						const int left = it.first- preSum.begin();
						v.emplace_back(left, i+1-left);
					}
				}
				int iMin = 1000'000;
				int iRet = iMin;
				for (int i = 0, j = 0; i < v.size(); i++) {
					while ((j < v.size()) && (v[j].first + v[j].second <= v[i].first)) {
						iMin = min(iMin, v[j].second);
						j++;
					}
					iRet = min(iRet, iMin+v[i].second);
				}
				return (iRet > arr.size()) ? -1 : iRet;
			}
		};

单元测试

class Solution {
		public:
			int minSumOfLengths(vector<int>& arr, int target) {
				vector<int> preSum(1);
				for (const auto& n : arr) {
					preSum.emplace_back(n + preSum.back());
				}
				vector<pair<int, int>> v;
				for (int i = 0; i < arr.size(); i++) {
					auto it = std::equal_range(preSum.begin(), preSum.end(), preSum[i+1] - target);
					const int len = it.second - it.first;
					if (1 == len ) {
						const int left = it.first- preSum.begin();
						v.emplace_back(left, i+1-left);
					}
				}
				int iMin = 1000'000;
				int iRet = iMin;
				for (int i = 0, j = 0; i < v.size(); i++) {
					while ((j < v.size()) && (v[j].first + v[j].second <= v[i].first)) {
						iMin = min(iMin, v[j].second);
						j++;
					}
					iRet = min(iRet, iMin+v[i].second);
				}
				return (iRet > arr.size()) ? -1 : iRet;
			}
		};

扩展阅读

我想对大家说的话
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛
失败+反思=成功 成功+反思=成功

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771
如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

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

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

相关文章

C语言 | Leetcode C语言题解之第368题最大整除子集

题目&#xff1a; 题解&#xff1a; int cmp(int* a, int* b) {return *a - *b; }int* largestDivisibleSubset(int* nums, int numsSize, int* returnSize) {int len numsSize;qsort(nums, numsSize, sizeof(int), cmp);// 第 1 步&#xff1a;动态规划找出最大子集的个数、…

Java | Leetcode Java题解之第371题两整数之和

题目&#xff1a; 题解&#xff1a; class Solution {public int getSum(int a, int b) {while (b ! 0) {int carry (a & b) << 1;a a ^ b;b carry;}return a;} }

【Python】函数内的全局变量关键字gobal值,在函数外调用,有块“免死金牌”

在python世界里&#xff0c;全局变量global关键字&#xff0c;在函数间的跳转&#xff0c;就像是被赋予独立于体系的全局者&#xff0c;拥有一块“免死金牌”。 他拥有一种特权——它只是函数内部的对象&#xff0c;但是却能在函数外&#xff0c;亮出自己身份的全局变量&#…

浅拷贝和深拷贝(图文详解)

前端面试中&#xff0c;面试官经常会提到关于浅拷贝和深拷贝的问题。但是我总是理解于它的表面&#xff0c;面试中再深挖一点就会卡壳&#xff0c;我想把我的理解写下来&#xff0c;希望可以帮助到大家&#xff0c;如果有错误的地方希望大家可以指正&#xff0c;以免误导~ 看这…

mysql的安装与初始化

mysql mysql5.7.40下载链接 mysql安装文档 1. 编译安装过程 yum install -y cmake # 安装cmake tar xf mysql-boost-5.7.40.tar.gz cd /root/mysql-5.7.40 cmake -LH # 查看cmake的默认参数&#xff0c;需要进入mysql目录 yum install -y gcc-c.x86_64 yum install -y bis…

漏洞挖掘 | 记一次伪静态页面的SQL注入

前言 最近工作繁忙&#xff0c;许久没有挖洞&#xff0c;打开度娘&#xff0c;凡事随缘&#xff0c;偶米头发~~(⊙﹏⊙) 涉及技能点 SQL注入基础原理 盲注常用函数及思路 burpsuite基础知识 过程记录 1.发现 在翻阅一EDU站点时&#xff0c;发现路径中带有明显的数字参数 …

Java语言程序设计基础篇_编程练习题*17.1 (创建一个文本文件)

题目&#xff1a;*17.1 (创建一个文本文件) 编写一个程序&#xff0c;如果文件 Exercise17_01.txt 不存在&#xff0c;就创建一个名为 Exercise17_01.txt 的文件。向这个文件追加新数据。使用文本 I/O 将 100 个随机生成的整数写入这个文件。文件中的整数用空格分隔。 习题思路…

Sqlite3数据库表内数据批量读取操作---sqlite3_stmt机制

0、引言 在前面两篇文章已经对数据环境搭建、数据批量写入库中进行了较为详细的讲解。因此&#xff0c;基于前两篇文章内容的基础上&#xff0c;本文主要从数据库中批量数据读取操作进行梳理讲解。 嵌入式数据库SQLite 3配置使用详细笔记教程_sqlite3-CSDN博客 SQLite 3 优化批…

TCP与UDP传输的学习

void *memset(void *s, int c, size_t n); 功能&#xff1a;将一块内存空间的每个字节都设置为指定的值&#xff1b;这个函数通常用于初始化一个内存空间&#xff0c;或者清空一个空间&#xff1b; 参数&#xff1a;viod * s 空类型指针&#xff0c;指向要填充内存块&#xf…

android13 隐藏状态栏里面的飞行模式 隐藏蓝牙 隐藏网络

总纲 android13 rom 开发总纲说明 目录 1.前言 2.问题分析 3.代码分析 4.代码修改 5.编译运行 6.彩蛋 1.前言 android13 隐藏状态栏里面的飞行模式,或者其他功能,如网络,蓝牙等等功能,隐藏下图中的一些图标。 2.问题分析 这里如果直接找这个布局的话,需要跟的逻…

ubuntu /windows 安装COLMAP

目录 一、COLMAP简介 二、ubuntu安装COLMAP 三、windows安装COLMAP 一、COLMAP简介 COLMAP 是一款用于3D重建和图像处理的软件&#xff0c;它结合了计算机视觉算法和优化技术&#xff0c;用于从一组图像中构建三维结构。COLMAP 是一个全功能的通用视觉测距和三维建模工具&a…

免费的AI认证考试

努力保持领先地位 过去几年&#xff0c;科技行业发展速度越来越快&#xff0c;尤其是人工智能和大型语言模型(LLM) 的出现。 作为该领域的资深软件开发人员&#xff0c;我也注意到一个人的经验很快就会变得过时。 就在几年前&#xff0c;神经网络和深度学习风靡一时。虽然这…

三星计划今年HBM4设计,2025年初开始样品测试

三星计划今年晚些时候完成首款HBM4内存设备的设计定稿&#xff0c;2025年初开始样品测试 根据nN Elec援引行业消息人士的报道&#xff0c;三星计划在今年晚些时候完成首款HBM4内存设备的设计定稿&#xff0c;并预计将于2025年初开始样品测试。该公司预计将采用其最新一代10纳米…

全新 Firebase AI 开发助手,助力构建应用的每一步

作者 / 助理产品经理实习生 Aayush Bandopadhyay 使用 Firebase 构建应用可以变得更加简单&#xff01; 了解 Firebase 中的 Gemini&#xff0c;从构思应用创意到编写安全代码&#xff0c;都将成为您的最佳助手。这个功能强大的新工具集成在 Firebase 控制台中&#xff0c;可以…

如何在算家云搭建模型mPLUG-Owl3(智能对话)

一、模型介绍 1. 项目背景与概述 mPLUG-Owl3 是阿里巴巴 mPLUG 团队最新发布的通用多模态大模型&#xff0c;该模型在理解和处理复杂多图及长视频内容方面实现了显著突破。这一创新成果不仅提升了模型的推理效率&#xff0c;还保持了高度的准确性&#xff0c;为多模态大模型的…

计算机毕业设计选题推荐-花园管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

Blender----利用DEM(tif)生成三维模型

首先需要安装Blender GIS这个插件&#xff1a;https://github.com/domlysz/BlenderGIS 一、TIFF的导入 可以通过GIS桌面端线查看DEM数据的信息&#xff0c;在blender中我们最好把TIF转换成3857或者其他投影的形式&#xff0c;推荐转成3857(web mector)投影是因为构建的模型可…

Leetcode-day31-01背包问题

46. 携带研究材料 1.dp数组代表的是什么&#xff1f; 这里的dp数组是一个二维数组&#xff0c;dp[i][j]是从前i个物品中任选放入容量j内的最大价值。 2.递推公式。 不放物品i&#xff1a;由dp[i - 1][j]推出&#xff0c;即背包容量为j&#xff0c;里面不放物品i的最大价值&am…

【时时三省】(C语言基础)数组参数

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 一维数组传参 一维数组传参 数组大小可以省略 也可以写成指针 如果这个一维数组是个指针数组 写成指针数组 或者写成二级指针 这个上面列的都是正确的写法 二维数组传参 第5行的写法是不行…

一条微博,让联想少卖16亿?

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 万万没想到&#xff0c;联想起诉的第一个自媒体博主竟然是万能的大熊。 微博账号“万能的大熊”因造谣联想集团&#xff0c;被判向联想赔礼道歉&#xff0c;要在微博账号首页置顶位置发布致歉声明并连续保留30日&…