611.有效三角形的个数

题目

链接:leetcode链接
在这里插入图片描述

思路分析(双指针)

如何构成一个三角形呢?
只需要两边之和大于第三边;
但是,如果已知三条边的大小关系,只需要两条较小边的和大于第三条边即可。

所以,我们需要首先进行排序来获取不同边的大小关系。

我们如何寻找两条较小边和一条大边呢?
不妨先固定一条大边,移动两条小边。
寻找两条小边就需要使用双指针算法。(不妨设大边为target)
设置left和right两个指针,left指向左边,right指向距离大边最近的一条边,依次向中间汇合,进行调整,即可得到答案。

在调整的过程中会遇到两种情况

(1) left + right > target
则,所有left右边的边都可以和right和target构成三角形,
个数位right - left。
right–继续寻找该target下的有效三角形
(2)left + right <= target
则,所有right左边的边都不能喝left和target构成三角形
left++继续寻找该target下的有效三角形。
在这里插入图片描述

寻找完所有的大边求和即可。

代码

class Solution {
public:
    int triangleNumber(vector<int>& nums) {
        int ret = 0;
        sort(nums.begin(),nums.end());
        
        for(int i = nums.size() - 1;i >= 2;--i)
        {
            int left = 0,right = i - 1;
            while(left < right)
            {
                if(nums[left] + nums[right] > nums[i])
                {
                    ret += right - left;
                    --right;
                }
                else
                {
                    ++left;
                }
            }
        }

        return ret;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值