列表

详情


NC254. 合法的三角形个数

描述

给一个长度为N的非负整数数组nums,请你计算一下,有多少个三元组代表的边长可以组成三角形
数据范围:


示例1

输入:

[2,3,4,4]

输出:

4

说明:

合法的有4个:
2 3 4(第一个4)
2 3 4(第二个4)
2 4 4
3 4 4

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 5ms, 内存消耗: 408KB, 提交时间: 2022-06-27

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */    
    /*int validTriangleNumber(vector<int>& nums) {
        // write code here
        int length = (int)nums.size();
        sort(nums.begin(), nums.end());
        int res = 0;
        for(int i=0;i<length;i++){
            for(int j=i+1;j<length;j++){
                for(int k=j+1;k<length;k++)
                    if(nums[i]+nums[j]>nums[k]) res++;
            }
        }
        return res;
    }*/
     int validTriangleNumber(vector<int>& nums) {
        // write code here
        int length = (int)nums.size();
        sort(nums.begin(), nums.end());
        int res = 0,i=length-1;
        while(i>=2){
            int left=0,right=i-1;
            while(left<right){
                if(nums[left]+nums[right]>nums[i]){
                    res+=(right-left);
                    right--;
                }else left++;
            }
            i--;
        }
        return res;
    }
};

C++ 解法, 执行用时: 5ms, 内存消耗: 424KB, 提交时间: 2022-05-08

class Solution {
  public:
    int validTriangleNumber(vector<int>& a) {
        int n = a.size();
        sort(a.begin(), a.end());
        int m = 0;
        for (int i = n - 1; i >= 2; i--) {
            int b = 0, c = i - 1;
            while ( b < c) {
                if (a[b] + a[c] > a[i]) {
                    m += (c - b);
                    c--;
                } else {
                    b++;
                }
            }
        }
        return m;
    }
};

C++ 解法, 执行用时: 5ms, 内存消耗: 428KB, 提交时间: 2022-03-10

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int validTriangleNumber(vector<int>& nums) {
        // write code here
        int n = nums.size();
        sort(nums.begin(), nums.end());
        int ret = 0;
        for (int i = n - 1; i >= 2; i--) {
            int l = 0, r = i - 1;
            while (l < r) {
                if (nums[l] + nums[r] > nums[i]) {
                    ret += (r - l);
                    r--;
                } else {
                    l++;
                }
            }
        }
        return ret;
    }
};

C++ 解法, 执行用时: 5ms, 内存消耗: 432KB, 提交时间: 2022-06-09

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int validTriangleNumber(vector<int>& nums) {
        // write code here
        int n=nums.size();
        sort(nums.begin(),nums.end());
        int m=0;
        for(int i=n-1;i>=2;i--){
            int l=0,r=i-1;
            while(l<r){
                if(nums[l]+nums[r]>nums[i]){
                    m+=(r-l);
                    r--;
                }
                else l++;
            }
        }
        return m;
    }
};

C++ 解法, 执行用时: 5ms, 内存消耗: 472KB, 提交时间: 2022-07-25

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int validTriangleNumber(vector<int>& nums) {
        // write code here
        int length = (int)nums.size();
        sort(nums.begin(), nums.end());
        int res = 0,i=length-1;
        while(i>=2){
            int left=0,right=i-1;
            while(left<right){
                if(nums[left]+nums[right]>nums[i]){
                    res+=(right-left);
                    right--;
                }else left++;
            }
            i--;
        }
        return res;
    }
};

上一题