双指针算法实例5(有效三角形的个数)

题目:

给定一个包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。

示例 1:

复制代码
输入: nums = [2,2,3,4]
输出: 3
解释:有效的组合是: 
2,3,4 (使用第一个 2)
2,3,4 (使用第二个 2)
2,2,3

示例 2:

复制代码
输入: nums = [4,2,3,4]
输出: 4

提示:

  • 1 <= nums.length <= 1000
  • 0 <= nums[i] <= 1000

算法原理:

三角形构成条件:任意两边之和一定要大于第三边

其实在判断中,只需要判断最小的两边和大于最长的一边即可

假设 a<=b<=c

若要构成三角形,a+b>c a+c>b b+c>a

其实a+c>b b+c>a是显然的,只需要判断a+b>c即可

1 排序(升序)

2 依次固定一个最大数c

从c左边的区间中选择a,b,满足a+b>c

左边界left,右边界right

a 若是numsleft+numsright>C

则numsright与区间内的任意一个(包括左边界)组合都能>C,个数是right-left

那么右边界的所有组合都统计完毕,right--

b 若是numsleft+numsright<=C

当numsleft+numsright<C,那么numsleft与区间内的任意一个组合都<C, left++

当numsleft+numsright=C,那么left++,舍弃较小的数

代码实现:

cpp 复制代码
class Solution 
{
public:
    int triangleNumber(vector<int>& nums) 
    {
        int n = nums.size();
        sort(nums.begin(),nums.end());
        int count = 0;
        for(size_t i = n-1;i>=2;i--)//依次固定最大数C
        {
            int left = 0;
            int right = i-1;
            while(left<right)
            {
                if(nums[left]+nums[right]>nums[i])//a+b>c
                {
                   count+=right-left;
                   right--;
                }
                else //a+b<=c
                {
                    left++;
                }
            }
        }
        return count;
    }
};
相关推荐
aramae5 小时前
MySQL复合查询(8)
java·c语言·开发语言·后端·算法
荆棘鸟智能6 小时前
城市感知设备怎么统一接入?从多协议网关到设备模型的中间件架构设计
人工智能·算法·边缘计算
INGNIGHT10 小时前
270 · 电话号码的字母组合II(Trie)
linux·算法
2401_8390805410 小时前
C++常见八股
数据结构·c++·算法
青山是哪个青山10 小时前
LeetCode 188:买卖股票的最佳时机 IV
算法
mikuyyds11 小时前
geo-toolbox 插件算法解析:RUSLE 与 MUSLE 的工程化落地
算法·rust·gis
a1879272183111 小时前
【算法】树(二):队列与祖先——BFS 骨架三配件、短路透传与合流
算法·leetcode·二叉树··bfs·算法讲解·树遍历
syagain_zsx11 小时前
算法基础篇 · 03 枚举(C++ 题解)
c++·算法·二进制·枚举
weixin_3077791312 小时前
C++代码实现MATLAB中的ode23tb函数功能
开发语言·c++·算法·matlab
我是章汕呐12 小时前
地级市能源消耗量及消耗强度数据【2006-2023年】平衡面板
人工智能·经验分享·算法·回归