Largest Perimeter Triangle

easy sorting greedy math

Problem

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.

Inputnums = [3, 6, 2, 3]
Output8
Sorted descending: [6, 3, 3, 2]. Sides 3 + 3 > 6 is false, so skip. Sides 3 + 2 > 3 is true, giving perimeter 3 + 3 + 2 = 8.

def largest_perimeter(nums):
    nums.sort(reverse=True)
    for i in range(len(nums) - 2):
        a, b, c = nums[i], nums[i + 1], nums[i + 2]
        if b + c > a:
            return a + b + c
    return 0
function largestPerimeter(nums) {
  nums.sort((x, y) => y - x);
  for (let i = 0; i < nums.length - 2; i++) {
    const a = nums[i], b = nums[i + 1], c = nums[i + 2];
    if (b + c > a) return a + b + c;
  }
  return 0;
}
class Solution {
    public int largestPerimeter(int[] nums) {
        Arrays.sort(nums);
        for (int i = nums.length - 1; i >= 2; i--) {
            int a = nums[i], b = nums[i - 1], c = nums[i - 2];
            if (b + c > a) return a + b + c;
        }
        return 0;
    }
}
int largestPerimeter(vector<int>& nums) {
    sort(nums.rbegin(), nums.rend());
    for (int i = 0; i + 2 < (int)nums.size(); i++) {
        int a = nums[i], b = nums[i + 1], c = nums[i + 2];
        if (b + c > a) return a + b + c;
    }
    return 0;
}
Time: O(n log n) Space: O(1)