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
Suppose the three sides of the triangle are a ≤ b ≤ 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 nums.
PythonJavaC++GoTypeScriptRustC
class Solution: def largestPerimeter(self, nums: List[int]) -> int: nums.sort() for i in range(len(nums) - 1, 1, -1): if (c := nums[i - 1] + nums[i - 2]) > nums[i]: return c + nums[i] return 0(code-box)
