题目链接
英文链接:https://leetcode.com/problems/valid-triangle-number/
中文链接:https://leetcode-cn.com/problems/valid-triangle-number/
题目详述
给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数。
示例 1:
1 | 输入: [2,2,3,4] |
注意:
- 数组长度不超过1000。
- 数组里整数的范围为 [0, 1000]。
题目详解
判断三条边能组成三角形的条件为:
- 任意两边之和大于第三边,任意两边之差小于第三边。
- 三条边长从小到大为 a、b、c,当且仅当
a + b > c这三条边能组成三角形。
方法一:暴力。
- 三重循环枚举。
- 时间复杂度为
O(n^3),可能会超时。
方法二:二分查找。
- 首先对数组排序。
- 固定最短的两条边,二分查找最后一个小于两边之和的位置。可以求得固定两条边长之和满足条件的结果。枚举结束后,总和就是答案。
- 时间复杂度为
O(n^2logn)。
1 | public class LeetCode_00611 { |
方法三:双指针。
- 首先对数组排序。
- 固定最长的一条边,运用双指针扫描。
- 如果
nums[l] + nums[r] > nums[i],同时说明nums[l + 1] + nums[r] > nums[i], ..., nums[r - 1] + nums[r] > nums[i],满足的条件的有r - l种,r左移进入下一轮。 - 如果
nums[l] + nums[r] <= nums[i],l右移进入下一轮。
- 如果
- 枚举结束后,总和就是答案。
- 时间复杂度为
O(n^2)。
1 | public class LeetCode_00611 { |