双指针 之 有效三角形的个数

题目出处:611. 有效三角形的个数 - 力扣(LeetCode)

思想:利用两条最小的边大于第三条边即为三角形这条定理,利用对撞指针来过滤不合理的

操作1:排序

操作2:固定最大的那条边,设置变量c

操作3:a指向索引0,b指向c前面一个数

代码

class Solution {
public:
    int triangleNumber(vector& nums) 
    {
        sort(nums.begin(), nums.end());//排序升序   logN * N
        int ret = 0;//返回值
        //利用三角形,两个最小的边相加大于第三条边,这个是最简单的判断
        //a + b > c
        //这里用的是下标
        int c = nums.size() - 1;
        int a = 0;
        int b = c - 1;
       
        if(c == 0)
            b = 0;
        

        while(a != b)//初始条件 a==b时,所有循环结束
        {
            while(a != b)//一个c循环结束
            {
                if(nums[a] + nums[b] > nums[c])
                {
                    ret += b - a;
                    b--;
                }
                else if(nums[a] + nums[b] <= nums[c])
                {
                    a++;
                }
            }
            c--;
            a = 0;
            b = c - 1;
        }

        return ret;

    }
};

你可能感兴趣的:(算法-双指针,算法,c++)