611. Valid Triangle Number**
https://leetcode.com/problems/valid-triangle-number/description/
题目描述
Given an array consists of non-negative integers, your task is to count the number of triplets chosen from the array that can make triangles if we take them as side lengths of a triangle.
Example 1:
Input: [2,2,3,4]
Output: 3
Explanation:
Valid combinations are:
2,3,4 (using the first 2)
2,3,4 (using the second 2)
2,2,3
Note:
- The length of the given array won’t exceed
1000
. - The integers in the given array are in the range of
[0, 1000]
.
解题思路
对数组进行从小到大排序, 指针 i
指向最长边, 然后在 [0, i - 1]
范围内搜索 l
和 r
使得 nums[l] + nums[r] > nums[i]
.
C++ 实现 1
class Solution {
public:
int triangleNumber(vector<int>& nums) {
if (nums.size() < 3) return 0;
int count = 0;
std::sort(nums.begin(), nums.end());
for (int i = nums.size() - 1; i >= 2; --i) {
int l = 0, r = i - 1;
while (l < r) {
if (nums[l] + nums[r] > nums[i]) {
count += r - l;
-- r;
} else ++ l;
}
}
return count;
}
};
C++ 实现 2
class Solution {
public:
int triangleNumber(vector<int>& nums) {
if (nums.size() < 3) return 0;
int count = 0;
std::sort(nums.begin(), nums.end());
// 三元组 (i, j, k), 那么 i 最多到 nums.size() - 3
// k 的初始值为 i + 2. k 最多移动到 nusm.size() - 1;
// 当确定 j 之后, 使用 while 循环知道第一个不满足 > 条件的 k,
// 那么满足条件的三角形就是 k - j - 1.
// 注意 k = i + 2 放置的位置, 当 j 发生变化时, nums[i+2,...,k-1]
// 肯定满足 nums[i] + nums[j] > nums[k] 的, 所以不需要重复累加.
for (int i = 0; i < nums.size() - 2; ++i) {
int k = i + 2;
for (int j = i + 1; j < nums.size() &&
nums[i] != 0 &&
nums[j] != 0; ++j) {
while (k < nums.size() && nums[i] + nums[j] > nums[k]) ++k;
count += k - j - 1;
}
}
return count;
}
};
来源:CSDN
作者:珍妮的选择
链接:https://blog.csdn.net/Eric_1993/article/details/103588186