降序排列,求解《976. 三角形的最大周长》

例题

976. 三角形的最大周长

给定由一些正数(代表长度)组成的数组 nums ,返回 由其中三个长度组成的、面积不为零的三角形的最大周长 。如果不能形成任何面积不为零的三角形,返回 0。 示例 1:
输入:nums = [2,1,2]
输出:5

答案

排序·降序

var largestPerimeter = function(nums) {
  const n = nums.length
  nums.sort((a, b) => b - a)
  for (let i = 0; i + 2 < n; i++) {
    if (nums[i + 1] + nums[i + 2] > nums[i]) return nums[i] + nums[i + 1] + nums[i + 2]
  }
  return 0
};
function largestPerimeter(nums: number[]): number {
  const n = nums.length
  nums.sort((a, b) => b - a)
  for (let i = 0; i + 2 < n; i++) {
    if (nums[i + 1] + nums[i + 2] > nums[i]) return nums[i] + nums[i + 1] + nums[i + 2]
  }
  return 0
};
func largestPerimeter(nums []int) int {
  n := len(nums)
  sort.Sort(sort.Reverse(sort.IntSlice(nums)))
  for i := 0; i + 2 < n; i++ {
    if nums[i + 1] + nums[i + 2] > nums[i] {
      return nums[i] + nums[i + 1] + nums[i + 2]
    }
  }
  return 0
}
class Solution {
  function largestPerimeter($nums) {
    $n = sizeof($nums);
    rsort($nums);
    for ($i = 0; $i + 2< $n; $i++) {
      if ($nums[$i + 1] + $nums[$i + 2] > $nums[$i]) return $nums[$i] + $nums[$i + 1] + $nums[$i + 2];
    }
    return 0;
  }
}
class Solution {
  public int largestPerimeter(int[] nums) {
    int n = nums.length;
    Arrays.sort(nums);
    for (int l = 0, r = n - 1; l < r; l++, r--) {
      int t = nums[l];
      nums[l] = nums[r];
      nums[r] = t;
    }
    for (int i = 0; i + 2 < n; i++) {
      if (nums[i + 1] + nums[i + 2] > nums[i]) return nums[i] + nums[i + 1] + nums[i + 2];
    }
    return 0;
  }
}
class Solution:
  def largestPerimeter(self, nums: List[int]) -> int:
    n, nums = len(nums), sorted(nums, reverse=True)
    for i in range(0, n - 2):
      if nums[i + 1] + nums[i + 2] > nums[i]: return nums[i] + nums[i + 1] + nums[i + 2]
    return 0
int cmp (const void *a, const void *b) {
  return *(int *)b - *(int *)a;
}
int largestPerimeter(int* nums, int numsSize){
   qsort(nums, numsSize, sizeof(int), cmp);
   for (int i = 0; i + 2 < numsSize; i++) {
     if (nums[i + 1] + nums[i + 2] > nums[i]) return nums[i] + nums[i + 1] + nums[i + 2];
   }
   return 0;
}
class Solution { // greater<int>()
public:
  int largestPerimeter(vector<int>& nums) {
    int n = nums.size();
    sort(nums.begin(), nums.end(), greater<int>());
    for (int i = 0; i + 2 < n; i++) {
      if (nums[i + 1] + nums[i + 2] > nums[i]) return nums[i] + nums[i + 1] + nums[i + 2];
    }
    return 0;
  }
};
class Solution { // 自定义排序函数
public:
  static bool cmp (int a, int b) {
    return a > b;
  }
  int largestPerimeter(vector<int>& nums) {
    int n = nums.size();
    sort(nums.begin(), nums.end(), cmp);
    for (int i = 0; i + 2 < n; i++) {
      if (nums[i + 1] + nums[i + 2] > nums[i]) return nums[i] + nums[i + 1] + nums[i + 2];
    }
    return 0;
  }
};
public class Solution {
  public int LargestPerimeter(int[] nums) {
    int n = nums.Length;
    Array.Sort(nums, delegate(int a, int b) {
      return b - a;
    });
    for (int i = 0; i + 2 < n; i++) {
      if (nums[i + 1] + nums[i + 2] > nums[i]) return nums[i] + nums[i + 1] + nums[i + 2];
    }
    return 0;
  }
}

JavaScript / TypeScript / PHP / GO / Python / C / C++ / C# / Java 自定义排序 + 位运算 / 字母哈希映射:求解《1356. 根据数字二进制下 1 的数目排序》
JavaScript / TypeScript / PHP / GO / Python / C / C++ / C# / Java 自定义排序 + 位运算 / 字母哈希映射,求解《1356. 根据数字二进制下 1 的数目排序》
排序,二分查找:求解《436. 寻找右区间》
排序,二分查找(Python 的 bisect.bisect_left 和 Golang 的 sort.Search),求解《436. 寻找右区间》
排序、最小值,基于排序获取中位数:求解《1887. 使数组元素相等的减少操作次数》《453. 最小操作次数使数组元素相等》和《462. 最少移动次数使数组元素相等 II》
排序、最小值,基于排序获取中位数,求解《1887. 使数组元素相等的减少操作次数》《453. 最小操作次数使数组元素相等》和《462. 最少移动次数使数组元素相等 II》