【数学】927. 三等分

news2024/11/19 10:30:53

本文涉及知识点

数学

LeetCode927. 三等分

给定一个由 0 和 1 组成的数组 arr ,将数组分成 3 个非空的部分 ,使得所有这些部分表示相同的二进制值。
如果可以做到,请返回任何 [i, j],其中 i+1 < j,这样一来:
arr[0], arr[1], …, arr[i] 为第一部分;
arr[i + 1], arr[i + 2], …, arr[j - 1] 为第二部分;
arr[j], arr[j + 1], …, arr[arr.length - 1] 为第三部分。
这三个部分所表示的二进制值相等。
如果无法做到,就返回 [-1, -1]。
注意,在考虑每个部分所表示的二进制时,应当将其看作一个整体。例如,[1,1,0] 表示十进制中的 6,而不会是 3。此外,前导零也是被允许的,所以 [0,1,1] 和 [1,1] 表示相同的值。

示例 1:

输入:arr = [1,0,1,0,1]
输出:[0,3]
示例 2:

输入:arr = [1,1,0,1,1]
输出:[-1,-1]
示例 3:

输入:arr = [1,1,0,0,1]
输出:[0,2]

提示:
3 <= arr.length <= 3 * 104
arr[i] 是 0 或 1

数学

没有1,直接返回{0,arr.size()-1}
我们将二进制数分为三部分:第一个1之前的部分,前导0。最后一个1后面的部分,后导0。其它是主体部分。
令1的个数等于cnt,如果cnt不是3的倍数,直接返回{-1,-1}。
令 m = cnt/3。 将1的下标放到indexs中。
判断主体部分是否相等
枚举 i = 0 to m
如果 indexs[i] - indexs[0] 和indexs[i+m] - indexs[m] 和 indexs[i+m2] - indexs[m2]不相等,则返回{-1,-1}。
判断后导0
cnt2 = arr.lenght()- ( indexs.back()+1)
如果 indexs[m] - indexs[m-1] -1 <cnt2 或indexs[2m] - indexs[2m-1] -1 <cnt2 则后导0不足,则返回{-1,-1}。
最终返回值:{indexs[m-1]+m,indexs[2*m]-前导0数量)

代码

核心代码

class Solution {
public:
	vector<int> threeEqualParts(vector<int>& arr) {
		vector<int> indexs;
		for (int i = 0; i < arr.size(); i++) {
			if (0 == arr[i]) { continue; }
			indexs.emplace_back(i);
		}
		if (indexs.empty()) { return { 0,(int)arr.size()-1 }; }
		if (0 != indexs.size() % 3) { return { -1,-1 }; };
		const int m = indexs.size() / 3;
		for (int i = 0; i < m; i++) {
			const int i1 = indexs[i] - indexs[0];
			const int i2 = indexs[i+m] - indexs[m];
			const int i3 = indexs[i+2*m] - indexs[2*m];
			if ((i1 != i2) || (i2 != i3)) { return { -1,-1 }; }
		}
		const int i0End = arr.size() - (indexs.back() + 1);
		const int iHas1 = indexs[m] - indexs[m - 1]-1;
		const int iHas2 = indexs[m * 2] - indexs[m * 2 - 1]-1;
		if ((iHas1 < i0End) || (iHas2 < i0End)) { return { -1,-1 }; }
		return { indexs[m - 1]+i0End,indexs[m * 2]- (iHas2-i0End) };
	}
};

单元测试

template<class T1,class T2>
void AssertEx(const T1& t1, const T2& t2)
{
	Assert::AreEqual(t1 , t2);
}

template<class T>
void AssertEx(const vector<T>& v1, const vector<T>& v2)
{
	Assert::AreEqual(v1.size(), v2.size());	
	for (int i = 0; i < v1.size(); i++)
	{
		Assert::AreEqual(v1[i], v2[i]);
	}
}

template<class T>
void AssertV2(vector<vector<T>> vv1, vector<vector<T>> vv2)
{
	sort(vv1.begin(), vv1.end());
	sort(vv2.begin(), vv2.end());
	Assert::AreEqual(vv1.size(), vv2.size());
	for (int i = 0; i < vv1.size(); i++)
	{
		AssertEx(vv1[i], vv2[i]);
	}
}

namespace UnitTest
{
	vector<int> arr;
	TEST_CLASS(UnitTest)
	{
	public:
		TEST_METHOD(TestMethod0)
		{
			arr = { 1, 0, 1, 0, 1 };
			auto res = Solution().threeEqualParts(arr);
			AssertEx({ 0, 3 }, res);
		}
			TEST_METHOD(TestMethod1)
			{
				arr = { 1, 1, 0, 1, 1 };
				auto res = Solution().threeEqualParts(arr);
				AssertEx({ -1,-1 }, res);
			}
			TEST_METHOD(TestMethod2)
			{
				arr = { 1, 1, 0, 0, 1 };
				auto res = Solution().threeEqualParts(arr);
				AssertEx({ 0,2 }, res);
			}
			TEST_METHOD(TestMethod3)
			{
				arr = { 0,0,0,0,0 };
				auto res = Solution().threeEqualParts(arr);
				AssertEx({ 0,4 }, res);
			}
	};
}

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步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
如无特殊说明,本算法用**C++**实现。

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

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

相关文章

芯世界技术有限公司:驱动全球芯片产业未来

在国家政策的强劲驱动下&#xff0c;科技创新如同新时代的璀璨明星&#xff0c;照亮了企业前行的道路。其中&#xff0c;香港创科作为由中华人民共和国和香港特别行政区共同设立的公共机构&#xff0c;承载着推动和支持本地科技企业发展的重要使命。这不仅仅是一个提供办公室、…

系统提示xlive.dll丢失有什么解决办法?详细解决办法介绍

如果你曾经在玩那些超酷的大型游戏时遇到过xlive.dll文件丢失的问题&#xff0c;那么你来对地方了&#xff01;这篇文章将带你一步步学习如何修复这个烦人的xlive.dll文件缺失问题。不仅如此&#xff0c;我们还会分享一些超级重要的注意事项&#xff0c;确保在修复过程中不会引…

你好,广州!6月15日,聚焦 PGConf.dev 2024 聊聊 IvorySQL 最新应用实践

「IvorySQL地区用户组」已在济南、成都、北京、南京等相继成立并成功举办多场线下技术沙龙&#xff0c;地区队伍在不断壮大&#xff0c;我们也很开心与社区伙伴们一起畅聊技术和开源文化&#xff0c;让更多优秀的小伙伴及其技术实践经验在社区中与大家分享。 广州&#xff1a;一…

PHP-CGI Windows平台远程代码执行漏洞(CVE-2024-4577)

文章目录 前言声明一、简介二、漏洞描述三、影响版本四、漏洞复现五、漏洞修复 前言 PHP 在设计时忽略 Windows 中对字符转换的Best-Fit 特性&#xff0c;当 PHP-CGI 运行在Window平台且使用了如下语系&#xff08;简体中文936/繁体中文950/日文932等&#xff09;时&#xff0…

2024泰迪智能科技大数据实训室方案

大数据实训室的主要目的是培养大数据平台运维项目的实践能力,以数据计算、分析、挖掘和可视化的案例训练为辅助。实训室旨在培养德智体全面发展、遵纪守法、掌握大数据平台运维基本技能、具备大数据应用、分析和系统管理与运维能力的高素质大数据技术人才。 大数据实训室建设的…

python之点云数据读取与可视化

1、前言 将文件中点云数据进行读取进来&#xff0c;并进行数据处理&#xff0c;将处理后的点云数据进行可视化显示&#xff0c;是非常常见的操作。本博客介绍如何将文本形式的点云数据读取进来&#xff0c;并进行可视化展示。 2、点云可视化 点云可视化即将点云数据在三维空间…

GIGE 协议摘录 —— GVSP 协议(三)

系列文章目录 GIGE 学习笔记 GIGE 协议摘录 —— 设备发现&#xff08;一&#xff09; GIGE 协议摘录 —— GVCP 协议&#xff08;二&#xff09; GIGE 协议摘录 —— GVSP 协议&#xff08;三&#xff09; GIGE 协议摘录 —— 引导寄存器&#xff08;四&#xff09; GIGE 协议…

[图解]建模相关的基础知识-08

1 00:00:01,650 --> 00:00:04,950 如果说&#xff0c;A乘BB乘A的话 2 00:00:06,350 --> 00:00:07,140 意味着什么 3 00:00:07,560 --> 00:00:08,420 A就等于B了 4 00:00:09,500 --> 00:00:10,680 只有两个相等 5 00:00:10,690 --> 00:00:13,360 它们的笛卡尔…

回收站照片永久删除找回?教你六个简单恢复方法

误删回收站照片怎么恢复&#xff1f;在使用电脑的时候&#xff0c;经常会遇到一些重要的文件被误删&#xff0c;并在删除之后又执行了清空回收站的操作。对于熟知电脑操作的用户都知道&#xff0c;如果说清空了回收站&#xff0c;恢复的难度相对来讲要大出很多。 那么&#xf…

【Java】解决Java报错:FileNotFoundException

文章目录 引言1. 错误详解2. 常见的出错场景2.1 文件路径错误2.2 文件名拼写错误2.3 文件权限问题2.4 文件路径未正确拼接 3. 解决方案3.1 检查文件路径3.2 使用相对路径和类路径3.3 检查文件权限3.4 使用文件选择器 4. 预防措施4.1 使用配置文件4.2 使用日志记录4.3 使用单元测…

Java--Math类和Random类

1.Math类简介 1.Math类中提供了大量用于数学运算的相关方法。 2.Math类是使用final修饰的终结类&#xff0c;不能产生子类 3.Math类中的方法都是static修饰的静态方法&#xff0c;可以通过类名.方法名直接调用 2.Math常用方法 1.abs(int)&#xff1a;求绝对值(int,long,floa…

5.1 系统模块划分探讨

一&#xff0e;指导思想 系统模块划分是指将一个系统按照功能或业务进行划分&#xff0c;以便于组织和管理系统的开发、维护和扩展。 一般来说&#xff0c;系统模块划分可以根据业务功能、技术层次和逻辑关系等方面进行。 二&#xff0e;理解业务领域 分析业务需求 要分析…

Java的一些补充性介绍

目录 什么是JDK&#xff0c;JRE 快速入门 学习路线&#xff1a; 如何快速掌握技术或知识点&#xff1a; IDEA 常用快捷键 IDEA创建项目、模块、包、类 模板/自定义模板 包 包的命名&#xff1a;​编辑 常用的包 如引入包 断点调试(debug)​编辑 多线程&#xff1a;…

西南交通大学【操作系统实验1】

实验目的 通过本实验了解Linux系统的组织和行为&#xff0c;观察各种存储系统状态信息的内核变量熟悉这些结构和信息 实验内容 理解Linux操作系统以及./proc文件熟悉codeblocks&#xff0c;学习Linux下c程序调试技术根据给定的程序观察cpuinfo/version/stat/uptime编程实现对…

泛微证券行业数据中心方案:打造多样化的数据收集、汇总、分析、决策一体化报表

证券企业在日常办公、业务开展时&#xff0c;涉及了诸多数据需求&#xff0c;而且数据来源于多部门、多个系统。需要对数据获取、汇总、展现进行高效、可视化的操作&#xff0c;高效利用数据价值&#xff0c;助力企业运营更高效、风险更可控。 泛微基于证券行业数字经营分析的需…

【Qt 学习笔记】Qt窗口 | 对话框 | 模态与非模态对话框的创建

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt窗口 | 对话框 | 创建模态及非模态对话框 文章编号&#xff1a;Qt 学…

12个Console命令,让js调试更简单

Console 对象用于 JavaScript 调试。JavaScript 原生中默认是没有 Console 对象&#xff0c;这是宿主对象&#xff08;也就是浏览器&#xff09;提供的内置对象。 用于访问调试控制台, 在不同的浏览器里效果可能不同。 Console 对象常见的两个用途&#xff1a; 显示网页代码运…

SAP STO跨公司间转储含POD交货操作简介

STO跨公司间转储含POD交货这个业务常见于集团性的公司&#xff0c; 1、同一个集团下A公司和B公司都是独立的&#xff0c;A公司向B公司进行采购。B公司会有一张交货单&#xff0c;然后基于交货单进行过账&#xff0c;收货&#xff0c;开票等操作。 2、当同一个公司下不同工厂间…

微信支付,微信平台证书如何下载,如何获取平台证书 wxpay如何初次获取平台证书 java初次生成平台证书, java生成微信platform.pem

1. 场景&#xff1a;使用ijpay&#xff0c;调用获取平台证书失败。 属于初次获取平台证书。 注&#xff1a;做返回校验使用&#xff0c;不校验好像也没事&#xff0c;但是支付无小事&#xff0c;强烈建议获取平台证书&#xff0c;校验后做回调相关处理&#xff01;&#xff01;…

【iOS】YYModel源码阅读笔记

文章目录 前言一、JSON转换库对比二、YYModel性能优化三、YYModel的使用四、架构分析YYClassInfo 剖析 五、流程剖析转换前准备工作 – 将JSON统一成NSDictionary将NSDictionary 转换为Model对象提取Model信息使用NSDictionary的数据填充Model 总结 前言 先前写了JSONModel的源…