当前位置: 面试刷题>> 三角形计数 (经典算法题500道)
### 题目描述补充
**题目:三角形计数**
给定一个包含非负整数的数组(或列表),数组中的每个数字代表一个平面上点的x坐标(假设所有点的y坐标均为0,即所有点都在x轴上)。现需要找出这些点中能够组成三角形的三个点的组合数量。三角形的要求是:任意两点之间的距离作为三角形的两边,需要满足三角形的两边之和大于第三边的条件。
**示例**:
- 输入:`[2, 2, 3, 4]`
- 输出:`3`
- 解释:能够组成三角形的组合有`(2, 3, 4)`,`(2, 4, 3)`,`(3, 4, 2)`。注意,由于点相同但顺序不同也被视为不同的组合,因此上述三个组合都是有效的。但`(2, 2, 3)`不是有效的三角形,因为两边之和并不总是大于第三边。
### PHP 代码示例
```php
function countTriangles($nums) {
$count = 0;
$n = count($nums);
sort($nums); // 先对数组进行排序
for ($i = $n - 1; $i >= 2; $i--) {
$left = 0;
$right = $i - 1;
while ($left < $right) {
if ($nums[$left] + $nums[$right] > $nums[$i]) {
// 由于数组已排序,左侧的所有元素与当前右侧元素组合均满足条件
$count += $right - $left;
$right--;
} else {
$left++;
}
}
}
return $count;
}
// 示例
$nums = [2, 2, 3, 4];
echo countTriangles($nums); // 输出 3
```
### Python 代码示例
```python
def countTriangles(nums):
nums.sort() # 先对数组进行排序
n = len(nums)
count = 0
for i in range(n - 1, 1, -1):
left, right = 0, i - 1
while left < right:
if nums[left] + nums[right] > nums[i]:
# 由于数组已排序,left到right-1的所有元素与right均满足条件
count += right - left
right -= 1
else:
left += 1
return count
# 示例
nums = [2, 2, 3, 4]
print(countTriangles(nums)) # 输出 3
```
### JavaScript 代码示例
```javascript
function countTriangles(nums) {
nums.sort((a, b) => a - b); // 先对数组进行排序
let count = 0;
const n = nums.length;
for (let i = n - 1; i >= 2; i--) {
let left = 0;
let right = i - 1;
while (left < right) {
if (nums[left] + nums[right] > nums[i]) {
// 左侧的所有元素与当前右侧元素组合均满足条件
count += right - left;
right--;
} else {
left++;
}
}
}
return count;
}
// 示例
const nums = [2, 2, 3, 4];
console.log(countTriangles(nums)); // 输出 3
```
**码小课网站中有更多相关内容分享给大家学习**,欢迎访问码小课获取更多编程算法、数据结构及面试技巧等资源。