解法
1 三重for循环每次枚举三个数进行判断 时间复杂度过高,可能超时(铁定超时)
2 二分算法
原理:先对数组排序,枚举三角形较小的两条边,再利用二分算法找到大于等于枚举两数之和最小的数,设下标为k,则枚举的数后面到k的数都是满足条件的
二分代码
class Solution {
public:
int find(int l,int x,vector<int>& nums)
{
int r=nums.size()-1;
while(l<r)
{
int mid=(l+r+1)/2;
if(nums[mid]<=x) l=mid;
else r=mid-1;
}
return l;
}
int ans=0;
int triangleNumber(vector<int>& nums) {
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size();i++)
{
for(int j=i+1;j<nums.size();j++)
{
int l=j+1;
int r=nums.size();
while(l<r)
{
int mid=(l+r)/2;
int x=nums[i]+nums[j];
if(nums[mid]>=x) r=mid;
else l=mid+1;
}
ans=ans+r-j-1;
}
}
return ans;
}
};
3 双指针算法
原理:先对数组排序,枚举最大边c,再将指针left指向最左边,指针right指向c的前一个位置
双指针代码实现
class Solution {
public:
int ans=0;
int triangleNumber(vector<int>& nums)
{
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])
{
ans=ans+r-l;
r--;
}
else
{
l++;
}
}
}
return ans;
}
};