3588.找到最大三角形面积

难度:中等

问题描述:

给你一个二维数组coords,大小为nx2,表示一个无限笛卡尔平面上n个点的坐标。

找出一个最大三角形的两倍面积,其中三角形的三个顶点来自coords中的任意三个点,并且该三角形至少有一条边与x轴或y轴平行。严格地说,如果该三角形的最大面积为A,则返回2*A。

如果不存在这样的三角形,返回-1。

注意,三角形的面积不能为零。

示例1:

输入:coords=[[1,1],[1,2],[3,2],[3,3]]

输出:2

解释:

图中的三角形的底边为1,高为2。因此,它的面积为1/2*底边*高=1。

示例2:

输入:coords=[[1,1],[2,2],[3,3]]

输出:-1

解释:

唯一可能的三角形的顶点是(1,1)、(2,2)和(3,3)。它的任意边都不与x轴或y轴平行。

提示:

1<=n==coords.length<=105

1<=coords[i][0],coords[i][1]<=106

所有coords[i]都是唯一的。

问题分析:

这是一个中规中矩的问题,用正常解决问题的思维逻辑分析即可。

阅读题目中的这一句,“其中三角形的三个顶点来自coords中的任意三个点,并且该三角形至少有一条边与x轴或y轴平行”,故处理步骤如下:

第一步:在coords中找出有哪些点组成的线段是平行于x轴或平行于y轴的,并根据是平行于y轴标记为1,平行于x轴标记为2,组成一个元素为[point1,point2,标记]的列表,这个功能由函数get_parallel_point(points)实现,在主程序中将处理的结果赋值给p2set变量。

第二步:将找到的平行于x轴或平行于y轴的两个点point1和point2从原coords中去掉,剩下的点就可以依次与这两个点组成不同的三角形,且保证这些三角形有一条边与x轴或y轴平行。这个功能由函数get_remain_points(point1,point2,points)实现,在主程序中将处理结果赋值给remain_points变量,然后可以遍历remain_points中的每个点,计算组成不同三角形面积的2倍,并记录其中的最大值。

第三步:如何计算三个点point1、point2和point3组成三角形的面积,这个功能由函数get_triangle_2area(p2,point3)实现。

主程序通过循环,合理调用三个函数即找出coords中最大三角形面积的2倍值。

程序如下:

#在给定的点points中,找出两点平行于x轴或y轴的,设置1标记表示平等于y轴,设置2标记表示平行于x轴,并以列表形式返回
def get_parallel_point(points):n=len(points)p_point=[]for i in range(n-1):point1 = points[i]for j in range(i+1,n):point2=points[j]if point1[0]==point2[0]:p_point.append([point1,point2,1])elif point1[1]==point2[1]:p_point.append([point1,point2,2])return p_point#在给定的点points中,去掉平行的两点之后,返回剩下的点的集合
def get_remain_points(point1,point2,points):return [point for point in points if point!=point1 and point!=point2]#对给定的包含两个平行点point1、point2和标记的数据,以及第三个点point3,计算三角形面积,并返回面积的两倍
def get_triangle_2area(p2,point3):point1=p2[0]point2=p2[1]flag=p2[2]if flag==1:h=abs(point3[0]-point1[0])return abs(point1[1]-point2[1])*helse:h=abs(point3[1]-point1[1])return abs(point1[0]-point2[0])*h#主程序
coords=eval(input('pls input coords='))
#找到所有的平行于x轴或y轴的点对组成的集合
p2set=get_parallel_point(coords)
print(f'在coords中找出平行于x轴或y轴的两点及标记的集合:',p2set)
max_triangle_area=0
for p in p2set:point1=p[0]point2=p[1]remain_points=get_remain_points(point1,point2,coords)print(f'在coords中除掉{point1}和{point2}之后剩下的点的集合为:{remain_points}')for point3 in remain_points:s=get_triangle_2area(p,point3)if s>max_triangle_area:max_triangle_area=sprint(f'由{point1}、{point2}、{point3}组成三角形的面积为{s},当前最大面积为{max_triangle_area}')
s=-1 if max_triangle_area==0 else max_triangle_area
print('coords中的点无法组成满足条件的三角形!' if s==-1 or s==0 else f'最大三角形的两倍面积为{s}')

运行实例一

pls input coords=[[1,1],[2,3],[3,5],[7,4]]

在coords中找出平行于x轴或y轴的两点及标记的集合: []

coords中的点无法组成满足条件的三角形!

运行实例二

pls input coords=[[3,3],[7,3],[4,8]]

在coords中找出平行于x轴或y轴的两点及标记的集合: [[[3, 3], [7, 3], 2]]

在coords中除掉[3, 3]和[7, 3]之后剩下的点的集合为:[[4, 8]]

由[3, 3]、[7, 3]、[4, 8]组成三角形的面积为20,当前最大面积为20

最大三角形的两倍面积为20

运行实例三

pls input coords=[[1,1],[5,1],[5,3],[7,3],[9,4]]

在coords中找出平行于x轴或y轴的两点及标记的集合: [[[1, 1], [5, 1], 2], [[5, 1], [5, 3], 1], [[5, 3], [7, 3], 2]]

在coords中除掉[1, 1]和[5, 1]之后剩下的点的集合为:[[5, 3], [7, 3], [9, 4]]

由[1, 1]、[5, 1]、[5, 3]组成三角形的面积为8,当前最大面积为8

由[1, 1]、[5, 1]、[7, 3]组成三角形的面积为8,当前最大面积为8

由[1, 1]、[5, 1]、[9, 4]组成三角形的面积为12,当前最大面积为12

在coords中除掉[5, 1]和[5, 3]之后剩下的点的集合为:[[1, 1], [7, 3], [9, 4]]

由[5, 1]、[5, 3]、[1, 1]组成三角形的面积为8,当前最大面积为12

由[5, 1]、[5, 3]、[7, 3]组成三角形的面积为4,当前最大面积为12

由[5, 1]、[5, 3]、[9, 4]组成三角形的面积为8,当前最大面积为12

在coords中除掉[5, 3]和[7, 3]之后剩下的点的集合为:[[1, 1], [5, 1], [9, 4]]

由[5, 3]、[7, 3]、[1, 1]组成三角形的面积为4,当前最大面积为12

由[5, 3]、[7, 3]、[5, 1]组成三角形的面积为4,当前最大面积为12

由[5, 3]、[7, 3]、[9, 4]组成三角形的面积为2,当前最大面积为12

最大三角形的两倍面积为12

运行实例四

pls input coords=[[1,1],[2,1],[4,1]]

在coords中找出平行于x轴或y轴的两点及标记的集合: [[[1, 1], [2, 1], 2], [[1, 1], [4, 1], 2], [[2, 1], [4, 1], 2]]

在coords中除掉[1, 1]和[2, 1]之后剩下的点的集合为:[[4, 1]]

由[1, 1]、[2, 1]、[4, 1]组成三角形的面积为0,当前最大面积为0

在coords中除掉[1, 1]和[4, 1]之后剩下的点的集合为:[[2, 1]]

由[1, 1]、[4, 1]、[2, 1]组成三角形的面积为0,当前最大面积为0

在coords中除掉[2, 1]和[4, 1]之后剩下的点的集合为:[[1, 1]]

由[2, 1]、[4, 1]、[1, 1]组成三角形的面积为0,当前最大面积为0

coords中的点无法组成满足条件的三角形!

解决问题可能有不同的方法,但如果能够抓住问题关键,可能事半功倍。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WIFI 安全测试记录

之前为实训课特意买的无线网卡没用上&#xff0c;但是我怎么可能让他荒废。所以用了几个下午&#xff0c;浅学了WiFi&#xff0c;当然没找到什么好教材&#xff0c;自己摸索着学的很基础&#xff0c;主要是当练习了&#xff0c;特此把我此前学习…WiFi密码实践过程写上来。 省流…

android14设置--网络--Internet副标题修改

收银机订制项目 插SIM卡&#xff0c;设备使用数据流量时&#xff0c;设置–网络–Internet副标题显示对应SIM卡运营商名称&#xff0c;客户要求修改这时的名称(注意图标也要同步修改) packages\apps\Settings\src\com\android\settings\network\InternetPreferenceController.j…

Web3区块链有哪些岗位?

Web3区块链领域的岗位丰富多样&#xff0c;涵盖技术开发、产品管理、运营、商务等多个方面&#xff0c;以下是具体介绍&#xff1a; - 技术开发类&#xff1a; - 智能合约开发工程师&#xff1a;负责编写、审计和优化智能合约&#xff0c;常见于DeFi开发&#xff0c;包括抵押…

解决 Spring Boot 对 Elasticsearch 字段没有小驼峰映射的问题

场景重现在使用 MyBatis/Mybatis-Plus 框架对 MySQL 操作时习惯了字段名小驼峰映射&#xff0c;然而在操作 Elasticsearch 时发现字段名没有小驼峰映射。解决方法1. 使用 ObjectMapper 手动转换&#xff1a; 这是最直接也最常用的方法。 在 Spring Boot 应用中使用 ObjectMappe…

Error:Cannot find module ‘chokidar‘

错误复现 在vue开发中&#xff0c;出现报错&#xff1a;Error&#xff1a;Cannot find module ‘chokidar’ 原因 缺包导致 解决方案 直接安装依赖包 npm install chokidar依旧无效&#xff0c;删除node_modules重新安装 rm -rf node_modules npm i

Spring AI 向量数据库详解与 RAG 简单实战项目

一、什么是向量数据库&#xff1f; 向量数据库用于存储、检索稠密语义向量&#xff08;Embedding&#xff09;&#xff0c;是构建 RAG&#xff08;检索增强生成&#xff09;系统的核心组件。它支持近似最近邻搜索&#xff08;ANN&#xff09;&#xff0c;可根据语义相似度找出…

【RK3568+PG2L50H开发板实验例程】Linux部分/FPGA FSPI 通信案例

本原创文章由深圳市小眼睛科技有限公司创作&#xff0c;版权归本公司所有&#xff0c;如需转载&#xff0c;需授权并注明出处&#xff08;www.meyesemi.com) 1. 简介 本案例旨在 ARM端运行 Linux系统&#xff0c;基通过 FSPI测试。 2. ARM端和 FPGA端通信流程 (1)ARM端实现SP…

github如何创建一个自己的仓库保姆级教程

文章目录 准备阶段(github官网)添加ssh公钥添加token创建仓库 本地设置本地代理创建仓库添加文件到仓库进行提交 准备阶段(github官网) 添加ssh公钥 创建SSH KEY。先看一下你C盘用户目录下有没有.ssh目录&#xff0c;有的话看下里面有没有id_rsa和id_rsa.pub这两个文件&#…

LabVIEW 网络流通信功能

LabVIEW 的网络流技术实现主机 VI&#xff08;Host VI&#xff09;与客户端 VI&#xff08;ClientVI&#xff09;间的双向数据交互&#xff0c;包含命令发送与波形数据传输&#xff0c;支持跨设备、跨进程的实时通信&#xff0c;满足分布式系统中数据交互与控制需求。 主机 VI逻…

Prompt 精通之路(一)- AI 时代的新语言:到底什么是 Prompt?为什么它如此重要?

AI 时代的新语言&#xff1a;到底什么是 Prompt&#xff1f;为什么它如此重要&#xff1f; 标签&#xff1a; #Prompt新手指南 #提示词入门 #AI指令 #人工智能 #ChatGPT &#x1f680; Prompt 精通之路&#xff1a;系列文章导航 第一篇&#xff1a;AI 时代的新语言&#xff1a…

uniapp 滚动tab

uniapp woui unibest <route lang"json5">{style: {navigationBarTitleText: 知识产权,navigationBarBackgroundColor: #C80F06,navigationBarTextStyle: white,backgroundColorTop: #C80F06,},} </route> <template><view class"bgc-b …

日事清驾驶舱模式上线:实时数据更新+项目管理+数据可视化,提升决策效率​

大家好&#xff01;我们在日事清最新更新中推出了一个令人激动的新功能——驾驶舱模式。这一全新界面将为企业管理者和团队提供一个全面、实时的数据展示平台。下面&#xff0c;让我们详细了解这个功能如何帮助您更好地把握企业动态和提升决策效率。 快速入口&#xff1a;一键激…

【Maven】Maven深度避坑指南:依赖冲突全维度解决方案与工业级实战(超万字解析)

注&#xff1a;本文基于50大型企业级项目经验&#xff0c;结合Maven底层源码机制&#xff0c;系统化解决依赖冲突问题。包含20个实战场景、10类特殊案例及5大防御体系构建方案。 Maven深度避坑指南&#xff1a;依赖冲突全维度解决方案与工业级实战&#xff08;超万字解析&#…

Rust Web 全栈开发(二):构建 HTTP Server

Rust Web 全栈开发&#xff08;二&#xff09;&#xff1a;构建 HTTP Server Rust Web 全栈开发&#xff08;二&#xff09;&#xff1a;构建 HTTP Server创建成员包/库&#xff1a;httpserver、http解析 HTTP 请求HTTP 请求的构成构建 HttpRequest 构建 HTTP 响应HTTP 响应的构…

小架构step系列01:小架构初衷

1 概述 小公司做业务服务&#xff0c;需要聚焦到实际的业务上&#xff0c;尽快通过业务服务客户&#xff0c;给客户创建价值&#xff0c;公司才能生存下去。在技术上采用的Web应用架构具备以下特点&#xff1a; 主要由开源组件组装而成。这样既可以节省成本&#xff0c;也可以把…

苹果AR/VR头显路线图曝光,微美全息推进AI/AR智能眼镜新品开启视觉体验篇章

日前&#xff0c;郭明錤发表了一篇关于苹果&#xff08;AAPL.US&#xff09;2025-2028头戴式产品路线图的文章&#xff0c;里面提到苹果正在开发涵盖MR头显、AI眼镜、AR眼镜、Birdbath眼镜等共计7款设备。 苹果的头显设备中&#xff0c;大量出货的产品是类似于Ray-Ban Meta的智…

python pyecharts 数据分析及可视化(2)

一、任务要求 任务二&#xff1a;感冒高发期分析 【任务说明】 感冒是一种常见的急性上呼吸道病毒性感染性疾病&#xff0c;多由鼻病 毒、副流感病毒、呼吸道合胞病毒、埃可病毒、柯萨奇病毒、冠状病 毒、腺病毒等引起。临床表现为鼻塞、喷嚏、流涕、发热、咳嗽、头 痛等&#…

React自学 基础一

React基础 React 是一个由 Facebook&#xff08;现 Meta&#xff09;开发并维护的、开源的 JavaScript 库&#xff0c;主要用于 构建用户界面&#xff08;UI&#xff09;&#xff0c;尤其是单页面应用程序中的动态、交互式界面。 简单示例&#xff1a; import React, { useSt…

PHP语法基础篇(八):超全局变量

超全局变量是在 PHP 4.1.0 中引入的&#xff0c;并且是内置变量&#xff0c;可以在所有作用域中始终可用。 PHP 中的许多预定义变量都是"超全局的"&#xff0c;这意味着它们在一个脚本的全部作用域中都可用。在函数或方法中无需执行 global $variable; 就可以访问它们…

NumPy-核心函数concatenate()深度解析

NumPy-核心函数concatenate深度解析 一、concatenate()基础语法与核心参数函数签名与核心作用基础特性&#xff1a;形状匹配规则 二、多维数组拼接实战示例1. 一维数组&#xff1a;最简单的序列拼接2. 二维数组&#xff1a;按行与按列拼接对比按行拼接&#xff08;垂直方向&…