[Leetcode] 有效三角形的个数

209 阅读1分钟

有效三角形的个数

解题思路

构成三角形的三条边需要符合两边之和大于第三边. 故 我们可以对输入的数组进行排序使数组有序. 当我们从大到小 固定最大边i时, 可将题目转变为在 [0, i)中, 寻找到 j, k使得 nums[i] < nums[j] + nums[k]. 即 两数之和大于目标值的题目 针对两数之和大于目标值. 我们可以从大到小依次确定大值k 遍历[0,k)找出符合条件的最小 j. 通过 k-j+1 确定当前次大边k下符合条件的三角形个数

代码

var triangleNumber = function (nums) {
  let result = 0
  const len = nums.length
  if (len < 3) return 0

  nums = nums.sort((a, b) => a - b)
  // 确定目标值
  for (let i = len - 1; i > 1; i--) {
    // 转为 求两数之和大于目标值的题目
    for (let k = i - 1; k > 0; k--) {
      let j = 0
      for (; j < k && nums[j] + nums[k] <= nums[i]; j++);
      if (j < k) result += k - j
    }
  }
  return result
}