简单有效的思路:双指针解法
比如给出一个nums={4,3,2,4,5,6,8,10}
先将nums排序 -> { 2, 3, 4, 4, 5, 6, 8, 10}
for(int i=nums.size()-1;i>=2;i--) i的下标为当前最大值的下标
左指针定义0 右指针定义目前最大值下标的左一位
再让左右下标进入while循环
三角形有个很重要的定义 如果较小的两边之和大于第三边那么该三角形一定成立
比如进入第一次while循环
left指向 2 right指向 8 2+8=10 三角形不成立 那么 left++
left指向3 right指向 8 3+8>10 成立 ,那么 right和left之间所有必然成立 count+=right-left
right-- 继续看成立否 直到 left==right 退出循环
代码如下
class Solution {
public:int triangleNumber(vector<int>& nums) {int count=0;sort(nums.begin(),nums.end());for(int i=nums.size()-1;i>=2;i--){int right=i-1;int left=0;while(right>left){if(nums[left]+nums[right]>nums[i]){int sum=right-left;count+=sum;right--;}else{left++;}}}return count;}
};