LeetCode 题解工作台

找到最大周长的多边形

给你一个长度为 n 的 正 整数数组 nums 。 多边形 指的是一个至少有 3 条边的封闭二维图形。多边形的 最长边 一定 小于 所有其他边长度之和。 如果你有 k ( k >= 3 )个 正 数 a 1 , a 2 , a 3 , ..., a k 满足 a 1 2 3 k 且 a 1 + a …

category

4

题型

code_blocks

5

代码语言

hub

3

相关题

当前训练重点

中等 · 贪心·invariant

bolt

答案摘要

我们可以将数组 排序,然后定义一个答案变量 ,初始值为 。 接下来,我们在 $[3, n]$ 的范围内枚举最长边 ,如果 $a_1 + a_2 + \cdots + a_{k-1} > a_k$,那么就可以构成一个周长为 $a_1 + a_2 + \cdots + a_k$ 的多边形。这里,我们可以使用前缀和数组 ,其中 $s_i = a_1 + a_2 + \cdots + a_i$,那么 $…

Interview AiBox logo

Interview AiBox 实时 AI 助手,陪你讲清 贪心·invariant 题型思路

试试 AiBox 面试助手arrow_forward
description

题目描述

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

多边形 指的是一个至少有 3 条边的封闭二维图形。多边形的 最长边 一定 小于 所有其他边长度之和。

如果你有 k (k >= 3)个  数 a1a2a3, ...,ak 满足 a1 <= a2 <= a3 <= ... <= ak a1 + a2 + a3 + ... + ak-1 > ak ,那么 一定 存在一个 k 条边的多边形,每条边的长度分别为 a1 ,a2 ,a3 , ...,ak 。

一个多边形的 周长 指的是它所有边之和。

请你返回从 nums 中可以构造的 多边形 最大周长 。如果不能构造出任何多边形,请你返回 -1 。

 

示例 1:

输入:nums = [5,5,5]
输出:15
解释:nums 中唯一可以构造的多边形为三角形,每条边的长度分别为 5 ,5 和 5 ,周长为 5 + 5 + 5 = 15 。

示例 2:

输入:nums = [1,12,1,2,5,50,3]
输出:12
解释:最大周长多边形为五边形,每条边的长度分别为 1 ,1 ,2 ,3 和 5 ,周长为 1 + 1 + 2 + 3 + 5 = 12 。
我们无法构造一个包含变长为 12 或者 50 的多边形,因为其他边之和没法大于两者中的任何一个。
所以最大周长为 12 。

示例 3:

输入:nums = [5,5,50]
输出:-1
解释:无法构造任何多边形,因为多边形至少要有 3 条边且 50 > 5 + 5 。

 

提示:

  • 3 <= n <= 105
  • 1 <= nums[i] <= 109
lightbulb

解题思路

方法一:排序 + 前缀和

我们可以将数组 numsnums 排序,然后定义一个答案变量 ansans,初始值为 1-1

接下来,我们在 [3,n][3, n] 的范围内枚举最长边 aka_k,如果 a1+a2++ak1>aka_1 + a_2 + \cdots + a_{k-1} > a_k,那么就可以构成一个周长为 a1+a2++aka_1 + a_2 + \cdots + a_k 的多边形。这里,我们可以使用前缀和数组 ss,其中 si=a1+a2++ais_i = a_1 + a_2 + \cdots + a_i,那么 a1+a2++ak1=sk1a_1 + a_2 + \cdots + a_{k-1} = s_{k-1},判断是否 sk1>aks_{k-1} > a_k,如果是,那么更新答案 ans=max(ans,sk)ans = \max(ans, s_k)

时间复杂度 O(n×logn)O(n \times \log n),空间复杂度 O(n)O(n)。其中 nn 是数组 numsnums 的长度。

1
2
3
4
5
6
7
8
9
10
class Solution:
    def largestPerimeter(self, nums: List[int]) -> int:
        nums.sort()
        s = list(accumulate(nums, initial=0))
        ans = -1
        for k in range(3, len(nums) + 1):
            if s[k - 1] > nums[k - 1]:
                ans = max(ans, s[k])
        return ans
speed

复杂度分析

指标
时间O(N\cdot logN)
空间O(N)
psychology

面试官常问的追问

外企场景
  • question_mark

    Sorting the array suggests a greedy approach for largest perimeter selection.

  • question_mark

    Examining triplets indicates knowledge of polygon inequalities.

  • question_mark

    Returning immediately on first valid triplet shows understanding of optimal greedy invariant.

warning

常见陷阱

外企场景
  • error

    Failing to sort the array may lead to suboptimal perimeter calculation.

  • error

    Not validating the polygon inequality for the triplet can produce invalid polygons.

  • error

    Assuming any three sides form a polygon without checking the longest side.

swap_horiz

进阶变体

外企场景
  • arrow_right_alt

    Find the polygon with the smallest perimeter instead of the largest, requiring reversed greedy logic.

  • arrow_right_alt

    Determine the number of distinct valid polygons that can be formed from nums.

  • arrow_right_alt

    Compute the largest perimeter for polygons with more than three sides, generalizing triplet checks.

help

常见问题

外企场景

找到最大周长的多边形题解:贪心·invariant | LeetCode #2971 中等