https://leetcode-cn.com/problems/valid-triangle-number/
思路一:排序+二分,枚举较小的两条边
i
、
j
i、j
i、j,然后通过二分找到最大的满足
a
[
i
]
+
a
[
j
]
>
a
[
k
]
a[i]+a[j]>a[k]
a[i]+a[j]>a[k]的
k
k
k,那么它们对答案的贡献为
k
−
j
k-j
k−j,代码略。
思路二:当 i i i确定的时候,显然 j j j越大, k k k也越大,因此可以利用双指针来做,每次把 j + 1 j+1 j+1,然后找到满足题意的最大的 k k k统计贡献即可。
class Solution {
public:
int triangleNumber(vector<int>& nums) {
int ans=0,n=nums.size();
sort(nums.begin(),nums.end());
for(int i=0;i<n-2;i++)
{
int l=i+1,r=i+2;
while(l<n-1)
{
while(r<n&&nums[r]<nums[i]+nums[l])
++r;
ans+=max(r-l-1,0);
++l;
}
}
return ans;
}
};