Find Polygon With the Largest Perimeter

Updated on 28 May, 2025
Find Polygon With the Largest Perimeter header image

Problem Statement

Given an array of positive integers called nums, we need to determine the largest possible perimeter of a polygon that can be constructed using the integers as side lengths. A polygon, by definition, needs at least three sides, and the longest side must be shorter than the sum of all the other sides combined.

In simpler terms, if we want to check if it's possible for k numbers (k >= 3) chosen from the array to form the sides of a polygon, they must satisfy two conditions:

  1. They are arranged in non-decreasing order.
  2. The sum of the first k-1 numbers must be greater than the k-th number.

Our task is to determine the largest perimeter that can be formed following these rules, or return -1 if no polygon meeting the conditions can be constructed.

Examples

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.

Constraints

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

Approach and Intuition

The approach is mainly based on sorting and checking triples because a polygon's minimal valid condition starts with 3 sides.

  1. First, sort the array nums in non-decreasing order. This will help to easily access the three largest elements at any point which are potential candidates for forming a polygon.

  2. Traverse the sorted array from the end to the beginning to check every possible trio (three consecutive elements):

    • For each triplet: Check if the sum of the two smaller sides is greater than the third side (the largest in the current triplet). This is derived from the polygon inequality theorem which states that in any polygon, the sum of lengths of any two sides must be greater than the third side.

    • If this condition is fulfilled, calculate the perimeter (sum of these three sides). Keep track of the maximum perimeter found.

    • If no such triplet satisfies the condition, return -1.

In the provided examples:

  • Example 1 uses the length [5, 5, 5]. Since 5 + 5 > 5, it forms a valid triangle with the perimeter being 15.
  • Example 2 inspects various combinations and uses the triplet [1, 1, 2] (amongst others) to form the max perimeter of 12.
  • Example 3 confirms that no triangle can be formed because 50 is not smaller than 5 + 5.

This approach efficiently determines the largest potential polygon's perimeter by leveraging sorting and a linear pass through the array, adhering to the constraints set out.

Solutions

  • C++
  • Java
  • JavaScript
  • Python
cpp
class Solution {
public:
    long long maxPerimeter(vector<int>& arr) {
        sort(arr.begin(), arr.end());
        long long sumOfLastTwo = 0;
        long long maxPerim = -1;
        for (int elem : arr) {
            if (elem < sumOfLastTwo) {
                maxPerim = elem + sumOfLastTwo;
            }
            sumOfLastTwo += elem;
        }
        return maxPerim;
    }
};

The given C++ solution focuses on finding the polygon with the largest perimeter using a set of side lengths provided in a vector array. Follow these key points to understand the solution implementation:

  • The initial step sorts the side lengths in ascending order using the STL sort function, ensuring that the largest numbers, which can potentially form the largest perimeter, are assessed last in the subsequent operations.
  • The solution employs two variables: sumOfLastTwo to keep a running sum of the side lengths, and maxPerim initialized to -1 to store the maximum perimeter found.
  • Iterate through the sorted vector of side lengths using a range-based for loop:
    • Inside the loop, check if the current element (a side length) is less than sumOfLastTwo (the sum of all previous elements). This condition ensures that a triangle can be formed using the current element as the largest side (ensuring the triangle inequality theorem is satisfied).
    • If true, update maxPerim to the sum of the current element and sumOfLastTwo, capturing the largest possible perimeter found thus far.
    • Add the current element to sumOfLastTwo for continuing the evaluation.
  • The loop exits after all elements are processed, and the maximum perimeter found (maxPerim) is returned.

This method effectively determines the largest perimeter possible by leveraging the properties of sorting and cumulative addition, ensuring efficient computation while adhering to geometric constraints.

java
class Solution {
    public long maxPerimeter(int[] edges) {
        Arrays.sort(edges);
        long sumOfPrevEdges = 0;
        long result = -1;
        for (int edge : edges) {
            if (edge < sumOfPrevEdges) {
                result = edge + sumOfPrevEdges;
            }
            sumOfPrevEdges += edge;
        }
        return result;
    }
}

The provided Java implementation finds the polygon with the largest perimeter given an array of edge lengths. Here’s a summary outlining how the code operates:

  • Start by sorting the array edges to reorder the edge lengths.
  • Initialize sumOfPrevEdges to track the cumulative sum of the previous edges and set result to -1 to handle cases where a polygon cannot be formed.
  • In the iteration over the sorted edges:
    • Compare each edge with the cumulative sum of all previous edges.
    • If the current edge is smaller than sumOfPrevEdges, it implies a valid polygon can potentially be formed, and you update result with the sum of the current edge and sumOfPrevEdges.
    • Add the current edge to sumOfPrevEdges to continue the accumulation for the next iteration.
  • Once all edges are processed, return result, which now holds the maximum perimeter possible or -1 if no valid polygon could be formed.

This algorithm efficiently calculates the parameter, leveraging the sorted properties of the edges and the triangle inequality theorem (the sum of any two sides must be greater than the third side). The sorting step ensures that this condition can be effectively checked.

js
var maxPerimeter = function(sides) {
    sides.sort((x, y) => x - y);
    let sumOfPrevious = 0;
    let result = -1;
    for (let side of sides) {
        if (side < sumOfPrevious) {
            result = side + sumOfPrevious;
        }
        sumOfPrevious += side;
    }
    return result;
};

The solution provided calculates the largest possible perimeter from a list of side lengths for a polygon. Here's a breakdown of how the code accomplishes its task:

  • Sort the array sides in ascending order. This arrangement helps in determining the combination of sides that can form a polygon.
  • Initialize sumOfPrevious to store the sum of all previously encountered sides. result is initialized to -1 to handle cases where a valid polygon cannot be formed.
  • Iterate through the sorted sides. During each iteration:
    • Check if the current side is less than the sum of all previous sides. According to polygon inequality theorem, a polygon can only be formed if the sum of lengths of the smaller sides is greater than the length of the largest side.
    • If the condition is met, update result to be the sum of the current side and all previous sides to represent the perimeter.
    • Accumulate the current side into sumOfPrevious for subsequent checks.
  • Return result, which either contains the largest possible perimeter or -1 if no valid polygon can be formed.

This approach effectively leverages sorting and a single pass through the array, making it efficient in terms of both time and space complexity.

python
class Solution:
    def maxPerimeter(self, values: List[int]) -> int:
        values.sort()
        sum_of_previous = 0
        result = -1
        for value in values:
            if value < sum_of_previous:
                result = value + sum_of_previous
            sum_of_previous += value
        return result

The solution provided outlines a method to find the polygon with the largest perimeter using the Python programming language. The function maxPerimeter() accepts a list of integers representing side lengths and aims to determine the maximum perimeter achievable under the conditions of a valid polygon. The steps of the operation are as follows:

  1. Sort the list of side lengths to facilitate validation checks.
  2. Initialize sum_of_previous to 0 for accumulating the sum of previous side values and result to -1 to handle cases where no valid polygon can form.
  3. Iterate through each sorted side length using a for loop:
    • Check if the current side is smaller than the sum of the previous sides to ensure that a polygon can be formed (triangle inequality theorem).
    • If true, update result with the new possible perimeter which is the current side plus the previous summed sides.
    • Update sum_of_previous by adding the current side length.
  4. Return result which holds the value of the largest perimeter if a valid polygon is found, or -1 indicating no valid polygon can be created.

Note that the provided code mainly focuses on verifying the potential to create a structure similar to a polygon and computes perimeter values accordingly. Ensure the input values strictly represent potential side lengths of geometric structures for correct outcomes.

Comments

No comments yet.