5.LeetCode算法习题讲解--双指针--有效三角形的个数

一.题目

习题链接:611. 有效三角形的个数 - 力扣(LeetCode)

二.题目讲解

注意:重复的也要统计在内

三.算法原理讲解

想要解决这道题首先要明确的是满足三角形的条件:任意两边之和大于第三边,但是这需要三个条件,我们可以简化为一个条件,即两个较小数之和大于最大的那一个就可以

我们首相想到的就是把所有情况都给遍历一遍,然后统计个数,但是这样效率会很低,这里我们利用双指针来实现:

下面我们举例分析:

首先我们需要将数组进行排列,然后定住最右边的那个数(10),给出两个指针一个指向最左边(2),一个指向最右边小于最大那个数(9),当left和right指向的两个数相加会出现两种情况:

一种是 a+b>c 可以构成三角形 ;另一种是 a+b<=c 不可以构成三角形

第一种:由于2+9已经大于10了,数组又是按升序排列,所以 2 , 9之间的数都要比2大,中间的数与9相加都会大于10,这时中间的数任意一个和9,10组合都能构成三角形,所以构成三角形的个数就是 right-left ,然后让 right-- ,最大数减小再次判断是否还大于c

第二种:由于2+9已经大于10了,数组又是按升序排列,所以 2 , 9之间的数都要比9小,中间的数与2相加都会小于10,这时中间的数任意一个和9,10组合都不能构成三角形,所以这时就需要让最小数left++,指向更大的数再次与9相加判断是否大于10

第一层循环结束的条件是 left >= right 这时说明以10为基准数的情况已经遍历完了,然后让c--,再次循环来找可以组合的情况

四.编写代码

cpp 复制代码
class Solution {
public:
    int triangleNumber(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        int num = 0;
        int c = nums.size() - 1;
        while(c > 1)
        {
            int left = 0, right = c - 1;
            while(left < right)
            {
                if(nums[left] + nums[right] > nums[c])
                {
                    num += right - left;
                    right--;
                }
                else
                {
                    left++;
                }
            }
            c--;
        }
       return num;
    }
};
相关推荐
小雉系统3 小时前
BcoreOS安全通信架构:FsSession 抗算法后门安全设计
算法·安全·架构
唐墨1237 小时前
linux kernel 比较数据大小的宏定义
linux·算法
拂拉氏8 小时前
【知识讲解-题目讲解】 统计满足K约束的子字符串数量2 (滑动窗口+前缀和+二分查找+分析)
算法·前缀和·二分查找·滑动窗口
lsc_blog11 小时前
听到优化风声,先准备能由自己掌控的事
数据库·分布式·中间件·职场和发展·重构
通信小呆呆12 小时前
电子战抗干扰技术:当“不被干扰”成为一种系统
算法·通信·mimo·isac
笑容掩饰我的失落12 小时前
区块链从小白到精通(八):从零实现一个标准 ERC-20 代币(完整可运行代码)
算法·区块链·php·智能合约·哈希算法
Severus_black13 小时前
【C++初阶】Stack、Queue算法题大练兵!
c语言·c++·算法·stl
2601_9679791215 小时前
机器学习必修课:经典算法与Python实战
python·算法·机器学习·实战·课程
程序猿打工仔16 小时前
计算机基础(C语言)考编、专技岗
c语言·开发语言·算法