
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:
- They are arranged in non-decreasing order.
 - The sum of the first 
k-1numbers must be greater than thek-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 <= 1051 <= 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.
First, sort the array
numsin non-decreasing order. This will help to easily access the three largest elements at any point which are potential candidates for forming a polygon.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]. Since5 + 5 > 5, it forms a valid triangle with the perimeter being15. - Example 2 inspects various combinations and uses the triplet 
[1, 1, 2](amongst others) to form the max perimeter of12. - Example 3 confirms that no triangle can be formed because 
50is not smaller than5 + 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
 
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 
sortfunction, ensuring that the largest numbers, which can potentially form the largest perimeter, are assessed last in the subsequent operations. - The solution employs two variables: 
sumOfLastTwoto keep a running sum of the side lengths, andmaxPeriminitialized 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 
maxPerimto the sum of the current element andsumOfLastTwo, capturing the largest possible perimeter found thus far. - Add the current element to 
sumOfLastTwofor continuing the evaluation. 
 - Inside the loop, check if the current element (a side length) is less than 
 - 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.
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 
edgesto reorder the edge lengths. - Initialize 
sumOfPrevEdgesto track the cumulative sum of the previous edges and setresultto -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 updateresultwith the sum of the current edge andsumOfPrevEdges. - Add the current edge to 
sumOfPrevEdgesto 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.
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 
sidesin ascending order. This arrangement helps in determining the combination of sides that can form a polygon. - Initialize 
sumOfPreviousto store the sum of all previously encountered sides.resultis 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 
resultto be the sum of the current side and all previous sides to represent the perimeter. - Accumulate the current side into 
sumOfPreviousfor 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.
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:
- Sort the list of side lengths to facilitate validation checks.
 - Initialize 
sum_of_previousto 0 for accumulating the sum of previous side values andresultto -1 to handle cases where no valid polygon can form. - Iterate through each sorted side length using a 
forloop:- 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 
resultwith the new possible perimeter which is the current side plus the previous summed sides. - Update 
sum_of_previousby adding the current side length. 
 - Return 
resultwhich 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.