class Solution {
public:
int triangleNumber(vector<int>& nums) {
sort(nums.begin(), nums.end());
int res = 0, n = nums.size();
for (int i = 0; i < n; i ++ )
{
int k = i;
for (int j = i + 1; j < n; j ++ )
{
while (k + 1 < n && nums[k + 1] < nums[i] + nums[j])
k ++ ;
res += max(k - j, 0);
}
}
return res;
}
};
双循环+二分:
O
(
n
2
l
o
g
(
n
)
)
O(n^{2}log(n))
O(n2log(n))
class Solution {
public:
int triangleNumber(vector<int>& nums) {
sort(nums.begin(), nums.end());
int res = 0, n = nums.size();
for (int i = 0; i < n; i ++ )
{
for (int j = i + 1; j < n; j ++ )
{
int l = j + 1, r = n - 1, k = j;
while (l <= r)
{
int mid = l + r >> 1;
if (nums[mid] < nums[i] + nums[j])
{
k = mid;
l = mid + 1;
}
else r = mid - 1;
}
res += max(k - j, 0);
}
}
return res;
}
};