一步步优化,开始,是相当于三重循环。效率很差
class Solution { public: int triangleNumber(vector<int>& nums) { int len=nums.size(); if(len<3) return 0; int count=0; sort(nums.begin(),nums.end(),greater<int>()); for(int i=0;i<=len-1;i++) { int sum=nums[i]; for(int j=i+1,k=j+1;j<=len-2;) { if(k<=len-1&&nums[j]+nums[k]>sum) { count++; // printf("%d %d %d\n",nums[i],nums[j],nums[k]); k++; } else { j++; k=j+1; continue; } } } return count; } };
后边使用了降序排序,然后i固定,j=i+1,k=len-1,效率还是很差。
class Solution { public: int triangleNumber(vector<int>& nums) { int len=nums.size(); if(len<3) return 0; int count=0; sort(nums.begin(),nums.end(),greater<int>()); for(int i=0;i<=len-1;i++) { int sum=nums[i]; for(int j=i+1,k=len-1;j<=len-2&&j<k;) { if(j<k&&nums[j]+nums[k]>sum) { count+=k-j; j++; k=len-1; } else if(nums[j]+nums[k]<=sum) k--; } } return count; } };
最后看到discussion中,解法直接用的升序的数组,思路一致,不知道是不是这个原因,少了降序排序,效率提高的很大。
class Solution { public: int triangleNumber(vector<int>& nums) { int len=nums.size(); if(len<3) return 0; int count=0; sort(nums.begin(),nums.end()); for(int i=len-1;i>=2;i--) { int l=0; int r=i-1; while(l<r) { if(nums[l]+nums[r]>nums[i]) { count+=r-l; r--; } else l++; } } return count; } };