976. Largest Perimeter Triangle
Description
Given an integer array nums, return the largest perimeter of a triangle with a non-zero area, formed from three of these lengths. If it is impossible to form any triangle of a non-zero area, return 0.
Example 1:
Input: nums = [2,1,2] Output: 5 Explanation: You can form a triangle with three side lengths: 1, 2, and 2.
Example 2:
Input: nums = [1,2,1,10] Output: 0 Explanation: You cannot use the side lengths 1, 1, and 2 to form a triangle. You cannot use the side lengths 1, 1, and 10 to form a triangle. You cannot use the side lengths 1, 2, and 10 to form a triangle. As we cannot use any three side lengths to form a triangle of non-zero area, we return 0.
Constraints:
3 <= nums.length <= 1041 <= nums[i] <= 106
Solutions
Solution 1: Sorting + Greedy
Thinking
Sides \(a\le b\le c\) form a triangle iff \(a+b>c\), and we want the largest perimeter. All triples are cubic. After sorting, try \(c\) from large to small with the two neighboring sides; the first triple that satisfies the inequality is optimal, otherwise that \(c\) cannot work.
Suppose the three sides of the triangle are \(a \leq b \leq c\). The triangle has non-zero area if and only if \(a + b \gt c\).
We can enumerate the largest side \(c\), then select the two largest remaining sides \(a\) and \(b\). If \(a + b \gt c\), a triangle with non-zero area can be formed, and its perimeter will be the largest possible; otherwise, continue to enumerate the next largest side \(c\).
The time complexity is \(O(n \log n)\), and the space complexity is \(O(\log n)\), where \(n\) is the length of the array \(\textit{nums}\).
1 2 3 4 5 6 7 | |
1 2 3 4 5 6 7 8 9 10 11 12 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
1 2 3 4 5 6 7 8 9 | |
1 2 3 4 5 6 7 8 9 10 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |