每日一题:Leetcode611.有效三角形的个数

题目描述

给定一个包含非负整数的数组 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

思路:

解法一:暴力求解利用三层循环从前往后找三个值,依次判断

解法二:利用单调性和双指针

先对数组进行排序,先固定最大的元素,利用双指针left从0开始,right从最大元素前一个开始,通过判断二者之和是否大于最大元素,从而实现计数。

代码实现:

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

你可能感兴趣的:(算法,数据结构)