【滑动窗口】C++算法:可见点的最大数目

news2025/4/23 22:40:20

作者推荐

动态规划 多源路径 字典树 LeetCode2977:转换字符串的最小成本

本题涉及知识点

滑动窗口

LeetCode 1610可见点的最大数目

给你一个点数组 points 和一个表示角度的整数 angle ,你的位置是 location ,其中 location = [posx, posy] 且 points[i] = [xi, yi] 都表示 X-Y 平面上的整数坐标。
最开始,你面向东方进行观测。你 不能 进行移动改变位置,但可以通过 自转 调整观测角度。换句话说,posx 和 posy 不能改变。你的视野范围的角度用 angle 表示, 这决定了你观测任意方向时可以多宽。设 d 为你逆时针自转旋转的度数,那么你的视野就是角度范围 [d - angle/2, d + angle/2] 所指示的那片区域。
对于每个点,如果由该点、你的位置以及从你的位置直接向东的方向形成的角度 位于你的视野中 ,那么你就可以看到它。
同一个坐标上可以有多个点。你所在的位置也可能存在一些点,但不管你的怎么旋转,总是可以看到这些点。同时,点不会阻碍你看到其他点。
返回你能看到的点的最大数目。
示例 1:
输入:points = [[2,1],[2,2],[3,3]], angle = 90, location = [1,1]
输出:3
解释:阴影区域代表你的视野。在你的视野中,所有的点都清晰可见,尽管 [2,2] 和 [3,3]在同一条直线上,你仍然可以看到 [3,3] 。
示例 2:
输入:points = [[2,1],[2,2],[3,4],[1,1]], angle = 90, location = [1,1]
输出:4
解释:在你的视野中,所有的点都清晰可见,包括你所在位置的那个点。
示例 3:
输入:points = [[1,0],[2,1]], angle = 13, location = [1,1]
输出:1
解释:如图所示,你只能看到两点之一。
提示:
1 <= points.length <= 105
points[i].length == 2
location.length == 2
0 <= angle < 360
0 <= posx, posy, xi, yi <= 100

滑动窗口

时间复杂度😮(nlogn),瓶颈在排序。
vSee记录了除重合点外,所有点的弧度。注意:angle是角度,要转化成弧度dAngle。
[d - angle/2, d + angle/2] 令d1=d-angle/2,则视野范围为[d1,d1+dAngle/2],d1+dAngle/2可能超过2PI,那样需要查询两次。可以将[2PI,2PI+dAngle]也加到vSee中。这样值需要查询一次。
枚举d1,取值范围为[0,2PI)。
站着的位置点,任何角度都可以看到。

代码

核心代码

class Solution {
public:
	int visiblePoints(vector<vector<int>>& points, int angle, vector<int>& location) {
		vector<double> vSee;
		const double PI = 3.1415926;
		const double dAngel = angle / 180.0 * PI;
		int iLocPointCount = 0;//和人重合的点,任何角度都可以看到
		for (const auto& v : points)
		{
			if ((v[1] == location[1]) && (v[0] == location[0]))
			{
				iLocPointCount++;
				continue;
			}
			double dAng = atan2(v[1] - location[1], v[0] - location[0]);
			vSee.emplace_back(dAng);
		}
		sort(vSee.begin(), vSee.end());
		
		for (int i = 0; (i < vSee.size()) && (vSee[i] <= dAngel); i++)
		{
			vSee.emplace_back(vSee[i] + PI * 2);
		}
		int iRet = 0;
		for (int i = 0,right=0; (i < vSee.size()) && (vSee[i] < PI*2); i++)
		{
			while ((right < vSee.size()) && (vSee[right] <= vSee[i] + dAngel))
			{
				right++;
			}
			iRet = max(iRet, right - i);
		}
		return iRet+ iLocPointCount;
	}
};

测试用例

template<class T>
void Assert(const T& t1, const T& t2)
{
	assert(t1 == t2);
}

template<class T>
void Assert(const vector<T>& v1, const vector<T>& v2)
{
	if (v1.size() != v2.size())
	{
		assert(false);
		return;
	}
	for (int i = 0; i < v1.size(); i++)
	{
		Assert(v1[i], v2[i]);
	}
}


int main()
{
	vector<vector<int>> points;
	int angle;
	vector<int> location;
	{
		Solution sln;
		points = { {1,2},{1,3},{1,0} }, angle = 13, location = { 1,1 };
		auto res = sln.visiblePoints(points, angle, location);
		Assert(2, res);
	}
	{
		Solution sln;
		points = { {1,2},{1,-1},{1,0} }, angle = 13, location = { 1,1 };
		auto res = sln.visiblePoints(points, angle, location);
		Assert(2, res);
	}
	{
		Solution sln;
		points = { {1,2},{1,3},{1,0} }, angle = 13, location = { 1,1 };
		auto res = sln.visiblePoints(points, angle, location);
		Assert(2, res);
	}
	{
		Solution sln;
		points = { {3,1},{2,1},{0,1} }, angle = 13, location = { 1,1 };
		auto res = sln.visiblePoints(points, angle, location);
		Assert(2, res);
	}
	{
		Solution sln;
		points = { {2,1},{-1,1},{0,1} }, angle = 13, location = { 1,1 };
		auto res = sln.visiblePoints(points, angle, location);
		Assert(2, res);
	}

	{
		Solution sln;
		points = { {2,1},{2,2},{3,3} }, angle = 90, location = { 1,1 };
		auto res = sln.visiblePoints(points, angle, location);
		Assert(3, res);
	}
	{
		Solution sln;
		points = { {2,1},{2,2},{3,4},{1,1} }, angle = 90, location = { 1,1 };
		auto res = sln.visiblePoints(points, angle, location);
		Assert(4, res);
	}
	{
		Solution sln;
		points = { {1,0},{2,1} }, angle = 13, location = { 1,1 };
		auto res = sln.visiblePoints(points, angle, location);
		Assert(1, res);
	}
	{
		Solution sln;
		points ={ {1,1},{2,2},{3,3},{4,4},{1,2},{2,1} }, angle = 0, location = { 1,1 };
		auto res = sln.visiblePoints(points, angle, location);
		Assert(4, res);
	}
}

2023年4月

class Solution {
public:
int visiblePoints(vector<vector>& points, int angle, vector& location) {
const double PI = 3.1415926;
int iSelfPoints = 0;
std::vector dAngles;
for (const auto& v : points)
{
if ((v[0] == location[0]) && (v[1] == location[1]))
{
iSelfPoints++;
continue;
}
dAngles.emplace_back(atan2(v[1] - location[1], v[0] - location[0]));
}
std::sort(dAngles.begin(), dAngles.end());
int iPointSize = dAngles.size();
for (int i = 0; i < iPointSize; i++)
{
dAngles.emplace_back(dAngles[i] + PI * 2);
}
int iRet = 0;
double dRange = angle / 180.0 * PI;
for (int i = 0; i < iPointSize; i++ )
{
int iCurNum = std::upper_bound(dAngles.begin() + i, dAngles.end(), dAngles[i]+dRange) - dAngles.begin() - i ;
iRet = max(iRet, iCurNum);
}
return iRet + iSelfPoints;
}
};

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步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/1345744.html

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

相关文章

Linux文件系统结构及相关命令1(man pwd ls ctrl +Shift +T ls /etc)

Linux的文件系统结构 某所大学的学生可能在一两万人左右&#xff0c;通常将学生分配在以学院-系班为单位的分层组织机构中。 如何查找一名学生&#xff1f; 最笨的办法&#xff1a;依次问询大学中的每一个学生&#xff0c;直到找到为止。 查询效率高的方法&#xff1a;按照从…

2023年新一代开发者工具 Vue ,正式开源!

以下文章来源于前端充电宝 &#xff0c;作者CUGGZ 近日&#xff0c;Vue 新一代开发者工具&#xff08;DevTools&#xff09;正式开源&#xff01;Vue DevTools 是一个旨在增强 Vue 开发人员体验的工具&#xff0c;它提供了一些功能来帮助开发者更好地了解 Vue 应用。下面就来看…

用IDEA创建/同步到gitee(码云)远程仓库(保姆级详细)

前言&#xff1a; 笔者最近在学习java&#xff0c;最开始在用很笨的方法&#xff1a;先克隆远程仓库到本地&#xff0c;再把自己练习的代码从本地仓库上传到远程仓库&#xff0c;很是繁琐。后发现可以IDEA只需要做些操作可以直接把代码上传到远程仓库&#xff0c;也在网上搜了些…

【FileZilla】的基本使用

一、FileZilla的使用 1.1 FileZilla简介 1.2 软件下载 到官方网站下载 FileZilla 的服务端和客户端程序 FileZilla - The free FTP solution 自行下载即可 1.3 软件安装 &#xff08;1&#xff09;先安装服务端【傻瓜式安装】&#xff0c;一直下一步下一步安装即可 &#xf…

Python绘制高级图表(1):绘制条形统计图

一、初始化 1. 引入库&#xff0c;设置画笔 from turtle import * t Turtle() t.color("black") t.width(3)2. 为了美观&#xff0c;画出xy轴 (1) 普通型 from turtle import * t Turtle() t.color("black") t.width(3)# 以画布为600 * 600为例 # 1.…

搭建maven私服

maven maven简介 什么是maven&#xff1f; Maven这个单词来自于意第绪语&#xff08;犹太语&#xff09;&#xff0c;意为知识的积累。 Maven项目对象模型(POM)&#xff0c;可以通过一小段描述信息来管理项目的构建&#xff0c;报告和文档的项目管理工具软件。 Maven 除了以…

算法训练day53|动态规划part14

参考&#xff1a;代码随想录 1143.最长公共子序列 重点&#xff1a;状态的转移与递推公式的确定 本题和动态规划&#xff1a;718. 最长重复子数组 (opens new window)区别在于这里不要求是连续的了&#xff0c;但要有相对顺序&#xff0c;即&#xff1a;"ace" 是 …

Spark任务调度与数据本地性

Apache Spark是一个分布式计算框架&#xff0c;用于处理大规模数据。了解Spark任务调度与数据本地性是构建高效分布式应用程序的关键。本文将深入探讨Spark任务调度的流程、数据本地性的重要性&#xff0c;并提供丰富的示例代码来帮助大家更好地理解这些概念。 Spark任务调度的…

小程序面试题 | 17.精选小程序面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

自然语言处理2——轻松入门情感分析 - Python实战指南

目录 写在开头1.了解情感分析的概念及其在实际应用中的重要性1.1 情感分析的核心概念1.1.1 情感极性1.1.2 词汇和上下文1.1.3 情感强度1.2 实际应用中的重要性 2. 使用情感分析库进行简单的情感分析2.1 TextBlob库的基本使用和优势2.1.1 安装TextBlob库2.1.2 文本情感分析示例2…

【Electron】webview 实现网页内嵌

实现效果&#xff1a; 当在输入框内输入某个网址后并点击button按钮 , 该网址内容就展示到下面 踩到的坑&#xff1a;之前通过web技术实现 iframe 标签内嵌会出现 同源策略&#xff0c;同时尝试过 vue.config.ts 内配置跨域项 那样确实 是实现啦 但不知道如何动态切换 tagert …

全球日光地图分布地图数据

日光地图分布地图数据 Daylight 是全球开放地图数据的完整分发版&#xff0c;可在社区和专业地图制作者的支持下免费获取。我们将 OpenStreetMap 等项目的全球贡献者的工作与日光制图合作伙伴的质量和一致性检查结合起来&#xff0c;创建免费、稳定且易于使用的街道比例全球地…

Java EE 网络原理之HTTPS

文章目录 1. HTTPS 是什么&#xff1f;2. "加密" 是什么&#xff1f;3. HTTPS 的工作过程3.1 引入对称加密3.2 引入非对称加密3.3 中间人攻击3.4 引入证书 4. Tomecat4.1 tomcat 的作用 1. HTTPS 是什么&#xff1f; HTTPS也是⼀个应用层协议&#xff0c;是在 HTTP …

C#使用switch语句更改窗体颜色

目录 一、示例 二、生成 用switch多路选择语句及窗体的BackColor属性更改窗体的BackColor属性。该属性用于获取或设置控件的背景颜色。 可以使用Color结构的静态属性获取Color对象&#xff0c;如Color.Red&#xff1b;也可以使用Color结构的静态方法Color.FromArgb()&#xf…

探索人工智能OCR:解放你的文字世界

嘿&#xff01;你听说过人工智能OCR吗&#xff1f;它是一项超酷的技术&#xff0c;让我们来看看它带来的种种好处&#xff1a; 自动化处理&#xff1a;再也不用费力去手动输入和处理大量的纸质文件啦&#xff01;有了人工智能OCR&#xff0c;它能够自动将印刷或手写的文本转换…

C++day4作业

定义一个Person类&#xff0c;私有成员int age&#xff0c;string &name&#xff0c;定义一个Stu类&#xff0c;包含私有成员double *score&#xff0c;写出两个类的构造函数、析构函数、拷贝构造和拷贝赋值函数&#xff0c;完成对Person的运算符重载(算术运算符、条件运算…

Matlab:K-means算法

K-means算法是一种常见的聚类算法&#xff0c;它将一组数据划分为K个不同的簇&#xff0c;以最小化每个簇内部数据点与簇中心之间的平方距离的总和为目标实现聚类。 1、基本步骤&#xff1a; 1.选择要划分的簇数K&#xff1b; 2.选择K个数据点作为初始的聚类中心&#xff1b…

探索 3D 图形处理的奥秘

最近一年多来&#xff0c;在 3Dfx、Intel 们的狂轰滥炸中&#xff0c;在 Quake、古墓丽影们的推波助澜下&#xff0c;三维图形已经成为计算机迷眼中的又一个热点。3D 世界到底是怎样的神奇&#xff0c;我们又是怎样享受它的乐趣呢&#xff1f;就让我们来一探究竟吧。 图形基础…

51单片机的中断相关知识

51单片机的中断相关知识点 一、中断概念和功能 概念 程序执行过程中CPU会遇到一些特殊情况&#xff0c;是正在执行的程序被“中断”&#xff0c;cpu中止原来正在执行的程序&#xff0c;转到处理异常情况或特殊事件的程序去执行&#xff0c;结束后再返回到原被中止的程序处(断…

使用SecoClient软件连接L2TP

secoclient软件是华为防火墙与友商设备进行微屁恩对接的一款软件,运行在windows下可以替代掉win系统自带的连接功能,因为win系统自带的连接功能总是不可用而且我照着网上查到的各种方法调试了很久都调不好,导致我一度怀疑是我的服务没搭建好,浪费了大把时间去研究其他搭建方案 …