- 原来没有逻辑的代码
class Solution { public: int triangleNumber(vector<int>& nums)
{ int s = nums.size();
if(s<3)
{ return 0; }
int count=0;
int m=0,n=0;
ranges::sort(nums);
for(int i=s-3;i>1;i--)
{
int x = nums[i];
m=0;
n=i-1;
while(m<n)
{
if(nums[m]+nums[n]>x)
{
count++;
//呜呜 错误的逻辑!
for(n--;n>m&&nums[n]==nums[n+1];n--)
count++;
for(m++;m<n&&nums[m]==nums[m-1];m++)count++;
}
else{ m++; }
}
}
return count;
}
};
-
- 然后使用两个指针left和right,left从0开始,right从i-1开始,向中间移动,检查nums[left] + nums[right] > nums[i]。如果成立,那么所有在left和right之间的元素与right组合都能满足条件,所以==count += right - left==,然后right—。否则,left++。
-
class Solution {
public:
int triangleNumber(vector
int s = nums.size();
if(s<3){
return 0;
}
int count=0;
int m=0,n=0;
ranges::sort(nums);
for(int i=s-1;i>1;i—){
int x = nums[i];
m=0;
n=i-1;
while(m<n){
if(nums[m]+nums[n]>x){
count+=n-m;
n—;
}
else{
m++;
}
}
}
return count;
}
};