【二分查找】3143. 正方形中的最多点数

news2024/12/23 11:00:56

本文涉及的基础知识点

C++二分查找

LeetCode3143. 正方形中的最多点数

给你一个二维数组 points 和一个字符串 s ,其中 points[i] 表示第 i 个点的坐标,s[i] 表示第 i 个点的 标签 。
如果一个正方形的中心在 (0, 0) ,所有边都平行于坐标轴,且正方形内 不 存在标签相同的两个点,那么我们称这个正方形是 合法 的。
请你返回 合法 正方形中可以包含的 最多 点数。
注意:
如果一个点位于正方形的边上或者在边以内,则认为该点位于正方形内。
正方形的边长可以为零。
示例 1:
在这里插入图片描述
输入:points = [[2,2],[-1,-2],[-4,4],[-3,1],[3,-3]], s = “abdca”
输出:2
解释:
边长为 4 的正方形包含两个点 points[0] 和 points[1] 。
示例 2:
在这里插入图片描述
输入:points = [[1,1],[-2,-2],[-2,2]], s = “abb”
输出:1
解释:
边长为 2 的正方形包含 1 个点 points[0] 。
示例 3:
输入:points = [[1,1],[-1,-1],[2,-2]], s = “ccd”
输出:0
解释:
任何正方形都无法只包含 points[0] 和 points[1] 中的一个点,所以合法正方形中都不包含任何点。
提示:
1 <= s.length, points.length <= 105
points[i].length == 2
-109 <= points[i][0], points[i][1] <= 109
s.length == points.length
points 中的点坐标互不相同。
s 只包含小写英文字母。

分析

性质一:某正方形包含点(x,y),则一定包含(-x,y)和(x,-y)。不包含类似。如果坐标是负数,改成绝对值,结果不变。
性质二通过性质一转换后。如果x<y,某正方形包含(x,y),则一定包含(y,y)。即正方形包含(x,y)等效与包含(y,y)。同理,x > y。包含(x,y),等效于包含(x,x)。两者结合,m= max(x,y),包含(x,y), 等效于包含(m,m)。正方形不包含(x,y)等效与不包含(m,m)。我们只需要记录各点的m。即雪切夫距离:两个点之间的距离定义是其各坐标数值差绝对值的最大值。
性质三:正方形包含(m,m)的充分必要条件是:edge >= m。
如果各标签都只有一个点,返回点的数量。否则求包括同一标签两个点或以上的最小正方形,令其变成为s。返回边长为s-1的正方形包含点的数量。

方法一:排序。

分治法:分别记录各标签的雪切夫距离,并按升序排序。x[i][1]的最小值就是s。

方法二:C++二分法

二分类型:寻找首端。
Check函数的参数范围:[1,109]。
Check函数:
任意x[i],大于等于mid的数量大于1,返回true。Check函数的时间复杂度:O(n),枚举所有点。总时间复杂度:O(nlogm),m = max(points)
所以标签都只有一个点,提前返回点的数量。故一定有解。否则,需要判断是否有解。

代码

核心代码

template<class INDEX_TYPE>
class CBinarySearch
{
public:
	CBinarySearch(INDEX_TYPE iMinIndex, INDEX_TYPE iMaxIndex):m_iMin(iMinIndex),m_iMax(iMaxIndex) {}
	template<class _Pr>
	INDEX_TYPE FindFrist( _Pr pr)
	{
		auto left = m_iMin - 1;
		auto rightInclue = m_iMax;
		while (rightInclue - left > 1)
		{
			const auto mid = left + (rightInclue - left) / 2;
			if (pr(mid))
			{
				rightInclue = mid;
			}
			else
			{
				left = mid;
			}
		}
		return rightInclue;
	}
	template<class _Pr>
	INDEX_TYPE FindEnd( _Pr pr)
	{
		int leftInclude = m_iMin;
		int right = m_iMax + 1;
		while (right - leftInclude > 1)
		{
			const auto mid = leftInclude + (right - leftInclude) / 2;
			if (pr(mid))
			{
				leftInclude = mid;
			}
			else
			{
				right = mid;
			}
		}
		return leftInclude;
	}
protected:
	const INDEX_TYPE m_iMin, m_iMax;
};

class Solution {
		public:
			int maxPointsInsideSquare(vector<vector<int>>& points, string s) {
				vector<int> ms[26];
				for (int i = 0; i < points.size(); i++) {
					ms[s[i] - 'a'].emplace_back(max(abs(points[i][0]), abs(points[i][1])));
				}
				auto Check = [&](int mid) {
					for (const auto& v : ms) {
						int cnt = 0;
						for (const auto& n : v) {
							cnt += (n <= mid);
						}
						if (cnt > 1) { return true; }
					}
					return false;
				};
				auto ret = CBinarySearch<int>(1, 1000'000'000).FindFrist(Check);
				if (!Check(ret)) { return s.length(); }
				int cnt = 0;
				for (const auto& v : ms) {					
					for (const auto& n : v) {
						cnt += (n < ret );
					}
				}
				return cnt;
			}
		};

单元测试

	vector<vector<int>> points;
		string s;
		TEST_METHOD(TestMethod11)
		{
			points = { {2,2},{-1,-2},{-4,4},{-3,1},{3,-3} }, s = "abdca";
			auto res = Solution().maxPointsInsideSquare(points, s);
			AssertEx(2, res);
		}
		TEST_METHOD(TestMethod12)
		{
			points = { {1,1},{-2,-2},{-2,2} }, s = "abb";
			auto res = Solution().maxPointsInsideSquare(points, s);
			AssertEx(1, res);
		}
		TEST_METHOD(TestMethod13)
		{
			points = { {1,1},{-1,-1},{2,-2} }, s = "ccd";
			auto res = Solution().maxPointsInsideSquare(points, s);
			AssertEx(0, res);
		}
		TEST_METHOD(TestMethod14)
		{
			points = { {16, 32}, { 27,3 }, { 23,-14 }, { -32,-16 }, { -3,26 }, { -14,33 }}, s = "aaabfc";
			auto res = Solution().maxPointsInsideSquare(points, s);
			AssertEx(2, res);
		}

扩展阅读

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

视频课程

先学简单的课程,请移步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/1990981.html

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

相关文章

大数据-Big Data

GPT-4o (OpenAI) 大数据&#xff08;Big Data&#xff09;指的是无法使用传统方法和工具在合理的时间内处理和分析的大规模数据集。大数据通常具有以下几种特征&#xff0c;也称为5V特征&#xff1a; 1. Volume&#xff08;数据量&#xff09;&#xff1a;大数据涉及到大量的信…

深度学习常用语句for param in params问题:为什么修改param之后,params对应元素也随之改变?

def sgd(params, lr, batch_size): #save"""小批量随机梯度下降"""with torch.no_grad():for param in params:param - lr * param.grad / batch_sizeparam.grad.zero_()sgd([w, b], lr, batch_size) 上述代码中&#xff0c;param遍历params的…

深度学习--------------Kaggle房价预测

目录 下载和缓存数据集访问和读取数据集总代码 数据预处理训练K折交叉验证模型选择总代码提交你的Kaggle预测提交Kaggle 下载和缓存数据集 import hashlib import os import tarfile import zipfile import requests# download传递的参数分别是数据集的名称、缓存文件夹的路径…

LabVIEW液压传动系统

开发了一种高效的液压传动系统&#xff0c;其特点在于采用LabVIEW软件与先进的硬件配合&#xff0c;实现能量的有效回收。此系统主要应用于工业机械中&#xff0c;如工程机械和船机械等&#xff0c;通过优化液压泵和马达的测试台设计&#xff0c;显著提高系统的能效和操作性能。…

华为OD机试 - 最长子字符串的长度(二) (Java 2024 D卷 100分)

华为OD机试 2024D卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;D卷C卷A卷B卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华…

为什么要推荐R语言?欢迎订阅专栏《R 探索临床数据科学》

统计分析的强大支持&#xff1a; R语言最初是为统计分析而设计的&#xff0c;至今仍然在这方面保持领先地位。无论是基础统计、回归分析、时间序列分析还是高级统计建模&#xff0c;R都能提供丰富的函数和包&#xff0c;帮助我们轻松实现各种统计分析&#xff0c;很简单的代码就…

搭建个人博客需要做哪些事

文章目录 前言搭建步骤站点服务器站点域名注册域名ICP 备案公安备案域名解析 博客图床图床是什么图床搭建 博客站点搭建建站工具本地搭建博客部署 站点运营百度收录百度统计 总结 前言 花了几天时间&#xff0c;搭建了一个个人博客&#xff0c;也算是完成了年初立的一个flag&a…

VSCODE调试程序

1、打开 2、具体测试过程 &#xff08;1&#xff09;把路径改成真正执行的程序的绝对路径&#xff08;${workspaceFolder}这个代表就是项目根目录&#xff09; &#xff08;2&#xff09;然后先注释preLauchTask。 &#xff08;3&#xff09;重新编译一下文件&#xff0c;make…

全新神经网络:Kolmogorov-Arnold网络更具解释性,有望为物理学家提供新假设

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

FDE Solver 的 enabled 选项是不开放的

FDE Solver 的 enabled 选项是不开放的 正文正文 在 Mode 工程文件中,只能添加一个 FDE Solver,并且,不同于结构组件,对于结构组件,我们通常可以使用如下脚本将其设置为不启用状态。 比如,我们这里有一个三角型结构。 我们通过如下脚本设置其为不启用状态后, CAD 显示…

准确度与精密度:差异和示例

准确度与精密度&#xff1a;差异和示例 文章目录 一、说明二、准确性的定义三、精度的定义四、飞镖板上的准确度与精确度五、如何记住准确度与精确度六、如何测试准确度和精密度 一、说明 当您依赖数据得出结论时&#xff0c;准确度和精确度是测量的关键属性。这两个概念都适…

Git合并多笔提交为一笔

Git合并多笔提交为一笔 1. 背景 在实际项目开发中&#xff0c;我们会基于生产分支拉出很多需求分支&#xff0c;在需求分支开发完成后再将代码合到生产分支&#xff0c;但随着提交次数越来越多&#xff0c;我们在合到生产分支的时候就得一笔一笔的入库&#xff0c;特别麻烦&a…

day14-测试自动化之Selenium的元素操作、浏览器操作等

一、元素操作 1.1.为什么要学习操作元素的方法&#xff1f; 1).需要让脚本模拟用户给指定元素输入值 2).需要让脚本模拟人为删除元素的内容 3).需要让脚本模拟点击操作 1.2.元素常用操作方法 1).click&#xff08;&#xff09;点击方法 2).send_keys(value) 输入方法 3).clear(…

手表运动报告生成以及手机展示

一.运动报告组成部分 一般一份运动健康的报告包括以下信息&#xff1a; 1.运动轨迹区。2.报告数据区。(运动总体概览&#xff0c;如距离&#xff0c;时长&#xff0c;训练表现等)3.曲线图表区。(心率曲线&#xff0c;海拔曲线&#xff0c;速度&#xff0c;配速曲线) 二.组成部…

PHP + Laravel + RabbitMQ + Redis 实现消息队列 (三) 消费队列在RabbitMQ和redis中的发布和订阅

发布订阅&#xff08;Pub/Sub&#xff09; 对于消息队列传统的模式来说&#xff0c;一个消费者消费一条消息&#xff0c;这条消息被消费之后就不会再次被其它的消费者消费。但是在发布订阅模式中&#xff0c;一条消息是可以被多个消费者消费的&#xff0c;这些消费者其实相当于…

SOMEIP_ETS_021:echoINT8

测试目的&#xff1a; 验证DUT在发送和接收INT8参数时&#xff0c;是否能够保持参数的值和顺序不变。 描述 本测试用例旨在检验DUT在处理包含INT8类型参数的SOME/IP消息时&#xff0c;是否能够正确地发送和接收这些参数&#xff0c;并且确保返回的方法响应消息中的INT8参数值…

QT(C#)-QTabWidget修改字体后Tab页显示不完整的解决方法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1、 前言2、问题示例3、解决方法 1、 前言 最近一段时间学习QT的程序开发&#xff0c;遇到了如标题所说的问题&#xff0c;经过查询和摸索找到了解决方法&#xff…

CSP-J 复赛 模拟题6

1.大小写字母互换&#xff1a; 题目描述 由输入给定一个字符串&#xff0c;你的任务是将原字符串中的大写字母转换成其对应的小写字母&#xff0c;还要将原字符串中的小写字母转换成对应的大写字母&#xff0c;其余字符不变。 输出转换之后得到的新字符串。 输入格式 一行…

Flink开发语言大比拼:Java与Scala怎么选好?

在选择Apache Flink的开发语言时&#xff0c;Java和Scala各有优劣&#xff0c;最合适的选择取决于项目需求、团队技能和偏好。 Apache Flink是一个开源流处理框架&#xff0c;广泛应用于实时数据处理场景&#xff0c;如金融交易监控、网络流量分析和用户行为分析等。Flink支持J…

水泵性能参数详解

水泵性能参数之流量 水泵流量是指水泵单位时间内输送液体的体积或重量&#xff0c;用符号Q来表示&#xff0c;常用单位有m/h、m/s、L/s或t/h。 水泵铭牌上标注的流量是这台泵的设计流量&#xff0c;又称额定流量&#xff0c;水泵在额定流量下运行效率最高。 水泵流量计算公式为…