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;
    }
};
相关推荐
我是海飞1 小时前
杰理JL703N SSD1306 OLED(128x64) 点阵屏移植说明
单片机·算法·嵌入式·音频·杰理
wabs6662 小时前
关于图论【最短路径之Bellman_ford 算法(单源有限最短路)|卡码网96.城市间货物运输III的思考】
数据结构·算法·图论·卡码网·bellman_ford·单源有限最短路
lsylalalala4 小时前
常见的排序算法1
数据结构·算法·排序算法
想吃火锅10054 小时前
【leetcode】54. 螺旋矩阵
算法·leetcode·矩阵
想吃火锅10055 小时前
【leetcode】300. 最长递增子序列
算法·leetcode·职场和发展
imaol15 小时前
数据结构---队列
java·数据结构·算法
数模竞赛Paid answer5 小时前
2026年电工杯数学建模A题绿电直连型电氢氨园区优化运行求解全过程论文及程序
算法·数学建模·电工杯
疯狂打码的少年5 小时前
【数据结构】串的模式匹配:KMP算法(重点)
数据结构·笔记·算法
Dr.kangder5 小时前
嵌入式面试总结(八)——大小端
嵌入式硬件·面试·职场和发展·架构·嵌入式