20240215-查找周长最大的多边形

题目要求

给你一个由长度为 n 的正整数 nums 组成的数组。

多边形是至少有 3 条边的封闭平面图形。多边形的最长边小于其他边之和。

相反,如果有 k 个(k >= 3)正实数 a1、a2、a3、...、ak,其中 a1 <= a2 <= a3 <= ... <= ak 且 a1 + a2 + a3 + ... + ak-1 > ak,则总是存在一个 k 边长为 a1,a2,a3,...,ak 的多边形。

多边形的周长是边长之和。

如果多边形的边可以由 nums 组成,则返回多边形的最大周长;如果无法创建多边形,则返回-1。

Example 1:

Input: nums = [5,5,5]
Output: 15
Explanation: The only possible polygon that can be made from nums has 3 sides: 5, 5, and 5. The perimeter is 5 + 5 + 5 = 15.

Example 2:

Input: nums = [1,12,1,2,5,50,3]
Output: 12
Explanation: The polygon with the largest perimeter which can be made from nums has 5 sides: 1, 1, 2, 3, and 5. The perimeter is 1 + 1 + 2 + 3 + 5 = 12.
We cannot have a polygon with either 12 or 50 as the longest side because it is not possible to include 2 or more smaller sides that have a greater sum than either of them.
It can be shown that the largest possible perimeter is 12.

Example 3:

Input: nums = [5,5,50]
Output: -1
Explanation: There is no possible way to form a polygon from nums, as a polygon has at least 3 sides and 50 > 5 + 5.

思路

根据这个题目对于多边形的定义和描述,直觉上感觉是一道动态规划的题目。首先要做的事情依然是排序。排序之后我们的,我的的dp数组需要存储的是截止到nums中的第i个元素的最长多边形的周长(多边形的边数量需要大于等于3)。排序之后的数组从前向后自然满足了多边形的第一个条件。

第二这种方法要求我们需要存储以当前边为结尾的最长多边形的和,也就是意味着我们需要把当天的第i个元素视作是多边形的最长边,那么我们需要做的就是在之前所有元素中找到元素之和能够大于当前的最长边即可。

那么我们现在的核心问题就变成了如何判断这一点,我们只需要在存储dp的同时存储当前元素之前的所有元素之和即可。如果这个sum大于当前的nums[i],就意味着我们在满足条件1的同时也满足了条件2,即可以把nums[i]加入到多边形中,然后更新多边形的周长即可。

最后需要注意本题的数据体量和数值都比较大,使用int会超过范围,比如使用long long类型。

本题的hint中说使用贪心算法,我觉得贪心也可以写成递归的形式,逻辑是一致的就可以。

代码

class Solution {
public:long long largestPerimeter(vector<int>& nums) {sort(nums.begin(), nums.end());int n = nums.size();long long sum = 0;long long result = -1;vector<long long> dp(n, -1);for (int i = 0; i < n; ++i) {if (i > 1) {if (nums[i] < sum) {dp[i] = nums[i] + sum;result = max(dp[i], result);}}sum += nums[i];cout << sum << ' ' << nums[i] << endl;}return result;}
};

时间复杂度

排序大于dp,所以是O(nlogn)。

空间复杂度

维护dp数组即可,O(n)。

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

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

相关文章

【c++】析构函数

1.特征 析构函数是特殊的成员函数&#xff0c;其特征如下&#xff1a; 1.析构函数名是在类名前加上字符~。 2.无参数无返回值类型。 3.一个类只能有一个析构函数。若未显式定义&#xff0c;系统会自动生成默认的析构函数。注意&#xff1a;析构函数不能重载。 4.对象生命周…

StringBuffer线程安全而StringBuilder线程不安全

下面我们从append方法的源码进行分析 StringBuilder Overridepublic StringBuilder append(String str) {super.append(str);return this;} StringBuffer Overridepublic synchronized StringBuffer append(String str) {toStringCache null;super.append(str);return this…

H12-821_48

48.下面是台路由器输出的BGP信息,关于这段信息描述措误的是 A.路由器的Router ID是1.1.1.9 B.display bgp network命令来显示BGP通过network ( BGP)的通告的路由信息 C.该路由器所在AS号是10 D.该路由器通过import-route命今引入了4.4.4.0/24的网段 答案&#xff1a;D 注释&am…

假期作业 10

1.整理磁盘操作的完整流程&#xff0c;如何接入虚拟机&#xff0c;是否成功识别&#xff0c;对磁盘分区工具的使用&#xff0c;格式化&#xff0c;挂载以及取消挂载 U盘接入虚拟机 在虚拟机--->可移动设备--->找到U盘---->连接 检测U盘是否被虚拟机识别 ls /dev/s…

Diffusion Transformer U-Net for MedicalImage Segmentation

用于医学图像分割的扩散变压器U-Net 摘要&#xff1a; 扩散模型在各种发电任务中显示出其强大的功能。在将扩散模型应用于医学图像分割时&#xff0c;存在一些需要克服的障碍:扩散过程调节所需的语义特征与噪声嵌入没有很好地对齐;这些扩散模型中使用的U-Net骨干网对上下文信…

Codeforces Round 926 (Div. 2)(A~C)

A. Sasha and the Beautiful Array 分析&#xff1a;说实话&#xff0c;打比赛的时候看到这题没多想&#xff0c;过了一下样例发现将数组排序一下就行&#xff0c;交了就过了。刚刚写题解反应过来&#xff0c;a2-a1a3-a2.....an-a(n-1) an - a1&#xff0c;所以最后结果只取决…

103.二叉树的锯齿形层序遍历

​​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;103. 二叉树的锯齿形层序遍历 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 每一层从左到右遍历&#xff0c;逐一判断是否需要反转。 解题代码&#xff1a; /*** Definition for a bina…

Python字典全面指南:基础操作与高级应用实例解析

在Python编程中&#xff0c;字典作为核心的数据结构之一&#xff0c;凭借其高效查询、动态添加与删除属性&#xff0c;成为了处理键值对数据的理想选择。本文将逐步详解Python字典的基本操作&#xff0c;并通过实际案例展示如何查找共同键、设置默认值、更新字典、合并字典&…

python工具方法 45 基于ffmpeg以面向对象多线程的方式实现实时推流

1、视频推流 参考基于ffmpeg模拟监控摄像头输出rtsp视频流并opencv播放 实现视频流的推流。 其基本操作就是,安装视频流推流服务器,ffmpeg,准备好要推流的视频。 命令如下所示:ffmpeg -re -stream_loop -1 -i 风景视频素材分享.flv -c copy -f rtsp rtsp://127.0.0.1:554/…

Java数组,你想要的重点都在这。

1.数组的概述 数组 , 就可以理解为多个多个数据的组合 是程序中的容器 : 数组 , 集合框架(以后会将 : List , Set , Map) 数组存储中的数据的特点 : 依次紧密排列 , 有序的 , 可以重复的 此时的数组 , 集合框架都是在内存中对多个数据的存储 . 数组的其他特点 : 一旦初始化…

STM32 与 ARM 谁比较强大?

STM32 和 ARM 是两个不同的概念&#xff0c;STM32 是一种微控制器产品&#xff0c;而 ARM 是一家处理器架构设计和许可的公司。因此&#xff0c;无法简单地比较它们的强大程度。 STM32 是基于 ARM Cortex-M 核的微控制器产品&#xff0c;具有高性能、低功耗、低成本和易于开发等…

突破编程_C++_高级教程(多线程编程的基础知识)

1 多线程编程基础 线程是操作系统能够进行运算调度的最小单位&#xff0c;它被包含在进程之中&#xff0c;每个进程至少有一个线程&#xff0c;即主线程。线程依赖于进程&#xff0c;不能单独存在。线程的主要作用是实现并发执行&#xff0c;即多个线程可以同时执行不同的任务…

怎么搭建自己的网站?

怎么搭建自己的网站 一.领取一个免费域名和SSL证书&#xff0c;和CDN 特点&#xff1a;支持Cloudflare CDN Cloudflare是全球知名的CDN提供商&#xff0c;如果你不想暴露你的源站&#xff0c;又想使用我们的二级域名&#xff0c;不需要前往Cloudflare添加域名&#xff0c;修…

【机器学习笔记】 6 机器学习库Scikit-learn

Scikit-learn概述 Scikit-learn是基于NumPy、 SciPy和 Matplotlib的开源Python机器学习包,它封装了一系列数据预处理、机器学习算法、模型选择等工具,是数据分析师首选的机器学习工具包。 自2007年发布以来&#xff0c;scikit-learn已经成为Python重要的机器学习库了&#xff…

家里台式机需要把一个网站发布到外网可用,怎么搞?--DDNS配置(动态域名解析配置)

前言 Dynamic DNS是一个DNS服务。当您的设备IP地址被互联网服务提供商动态变更时,它提供选项来自动变更一个或多个DNS记录的IP地址。 此服务在技术术语上也被称作DDNS或是Dyn DNS 如果您没有一个静态IP,那么每次您重新连接到互联网是IP都会改变。为了避免每次IP变化时手动更…

java数据结构与算法刷题-----LeetCode18. 四数之和

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 解题思路 此题为三数之和的衍生题&#xff0c;代码完全一样&#xff0c;只…

全局异常处理器简单使用

一、为什么需要全局异常处理器&#xff1f; 统一异常处理&#xff1a;在应用程序中&#xff0c;可能会出现各种各样的异常情况&#xff0c;如数据库连接失败、资源不存在、权限问题等等。全局异常处理器允许我们统一处理这些异常&#xff0c;而不是在每个地方都去处理它们&…

一、Java安装JDK8

Java安装JDK8 一、Centos7.91.命令行安装2.安装包安装2.1 下载2.2 安装2.3 配置java环境 二、Windows1.下载2.安装3.配置环境变量 一、Centos7.9 1.命令行安装 yum install java-1.8.0-openjdk.x86_642.安装包安装 2.1 下载 下载地址&#xff1a;https://www.oracle.com/cn…

基于T1w/T2w 比值揭示髓磷脂相关变化

前言&#xff1a; 最近在阅读文献的时候发现2篇文章&#xff0c;是采用T1w/T2w 比值表征髓磷脂&#xff0c;有点感兴趣&#xff0c;因此尝试了一下文献所提出的方法。&#xff08;https://www.ncbi.nlm.nih.gov/pmc/articles/PMC9247578/ https://www.ncbi.nlm.nih.gov/pmc/ar…

鸿蒙开发系列教程(二十四)--List 列表操作(3)

列表编辑 1、新增列表项 定义列表项数据结构和初始化列表数据&#xff0c;构建列表整体布局和列表项。 提供新增列表项入口&#xff0c;即给新增按钮添加点击事件。 响应用户确定新增事件&#xff0c;更新列表数据。 2、删除列表项 列表的删除功能一般进入编辑模式后才可…