【算法专题】双指针算法之611. 有效三角形的个数(力扣)

欢迎来到CILMY23的博客

🏆本篇主题为:双指针算法之611. 有效三角形的个数(力扣)

🏆个人主页:CILMY23-CSDN博客

🏆系列专栏:Python | C++ | C语言 | 数据结构与算法 | 贪心算法 | Linux | 算法专题

🏆感谢观看,支持的可以给个一键三连,点赞关注+收藏。


题目:

611. 有效三角形的个数 - 力扣(LeetCode) 

 

一、题目解析

题目给了我们一个非负整数的数组nums, 

  1. 求可以组成三角形三条边的三元组个数。

现在就是回到如何组成一个三角形了。假设三角形的三条边是a,b,c,那么

两边之和大于第三边并且两边之差小于第三边

以及 |a-b| > c. 

因此可以先写一个模块化的函数用来判断三角形是否成立。

//判断三角形是否成立
bool Triangle(int a,int b ,int c)
{
     if(a+b>c && a+c>b && b+c>a && fabs(a-b) < c || a == b == c)
     {
        return true;
     }
     return false;
}

二、算法原理

当我们全部都遍历数组后,并且测试

那说明暴力破解这题是不可取的了,那回看代码发现

优化的点有两个

1.判断三角形能否更简化

2.能否不全部遍历数组 

所以我们需要对数组进行一个排序

排完序后,我们判断三角形的条件就简单了,a+b>c即可 

现在我们对排完序的数组进行分析,首先固定一个最大的数C,双指针控制a和b,枚举最小的a和最大的除c以外的b

假设a+b>c,那么因为我们排序了,所以我们知道从a到b中间的任何一个值拿来替换a都是可以满足a+b>c这个条件的。

假设a+b<=c ,那也因为我们排序了,b已经是除C以外最大的数了,那么a还有提升空间,a不满足,我们就让a变大,所以a只需要往前走即可。

找到a+b满足大于c直到相遇,循环结束,所有可能的组合都完成了 ,时间复杂度就变成了O(n*n)。

三、代码编写

class Solution 
{
public:
    //判断三角形是否成立
    bool Triangle(int a,int b ,int c)
    {
        if(a+b>c)
        {
            return true;
        }
        return false;
    }

    int triangleNumber(vector<int>& nums) 
    {
        int time = 0;
        //对数组进行排序
        sort(nums.begin(),nums.end());

        for (int c = nums.size()-1;c>=2;c--)//确定C的位置
        {
            int left = 0;
            int right = c-1;
            while(left < right)
            {
                if(Triangle(nums[left],nums[right],nums[c])== true)
                {
                    time += right - left;
                    right--;
                }
                else
                {
                    left++;
                }
            }
        }
         return time; 
    }
};

🛎️感谢各位同伴的支持,本期C++算法专题就讲解到这啦,如果你觉得写的不错的话,可以给个一键三连,点赞,关注+收藏,若有不足,欢迎各位在评论区讨论。    

  • 19
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值