一、题目解析
这里需要得出所有符合条件的三角形组合,并且当有重复元素时,如2,3,4用的是第一个2,3,4用的第二个2一样。
二、算法解析
通过数学知识,给我们三个数,就可以判断是否能构成三角形
我们可以先对数组进行排序,来达到a<=b<=c的情况,减少判断次数。
解法1:暴力解法 O(n^3)
由于需要三个数,所以通过三层for循环,用于枚举出所有排列可能,然后根据上面的条件判断是否满足条件。
解法2:根据单调性,使用双指针 O(n^2)
由于我们对数组先做排序处理,即最后的元素为最大的元素,固定最大元素,left在开头位置,right在固定最大的元素的前一个位置,通过双指针找出符合条件的三角形。
遍历数组固定最大值,然后通过双指针快速统计出符合区要求的三角形个数。
枚举最大的数为n次,每次都要通过双指针遍历数组也是n,所以时间复杂度为O(n^2)
可以先根据解析去自己完成代码,链接:611. 有效三角形的个数 - 力扣(LeetCode)
三、代码示例
class Solution {
public:int triangleNumber(vector<int>& nums) {int sum = 0;sort(nums.begin(),nums.end());//使用sort对数组进行排序,这里的begin()和end()为迭代器for(int i = nums.size()-1;i>=2;i--){int left = 0,right = i-1;//每次固定最大值,双指针也需要更新,所以在循环内定义while(right != left){if(nums[left] + nums[right] > nums[i]){sum += right - left;right--;}else left++;}}return sum;}
};
看到最后,如果对您有所帮助还请留下一个免费的赞和收藏吧,我们下期再见!