当前位置: 首页 > article >正文

【优选算法】有效三角形的个数

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

算法原理:

数学知识:给三个数,判断是否能够构成三角形

优化:先对整个数组排序

方法一:暴力枚举

class Solution {
    public int triangleNumber(int[] nums) {
        int n = nums.length;
        Arrays.sort(nums);
        int ans = 0;
        for (int i = 0; i < n; i++) {
            for (int j = i - 1; j >= 0; j--) {
                for (int k = j - 1; k >= 0; k--) {
                    if (nums[j] + nums[k] > nums[i]) ans++;
                }
            }
        }
        return ans;
    }
}

复杂度分析:

  • 时间复杂度:排序时间复杂度为 O(nlogn);三层遍历找所有三元祖的复杂度为 O(n^3)。整体复杂度为 O(n^3)
  • 空间复杂度:O(logn)

方法二:利用单调性,使用双指针算法来解决问题 

1.先固定最大的数

2.在最大的数的左区间内,使用双指针算法,快速统计出符合要求的三元组的个数

class Solution {
    public int triangleNumber(int[] nums) {
        //1.优化,排序
        Arrays.sort(nums);
        //2.利用双指针解决问题
        int ret = 0, n = nums.length;
        for(int i = n - 1; i >= 2; i--){//先固定最大值
            //利用双指针快速统计出符合要求的三元组的个数
            int left = 0, right = i - 1;
            while(left < right){
                if(nums[left] + nums[right] > nums[i]){
                    ret += right - left;
                    right--;
                }else{
                    left++;
                }
            }
        }
        return ret;
    }
}

http://www.kler.cn/a/460902.html

相关文章:

  • SpringBoot集成ECDH密钥交换
  • Linux C/C++编程-网络程序架构与套接字类型
  • 【Java 新特性】深入浅出 Java Lambda 表达式
  • vim里搜索关键字
  • 【Windows】Windows系统查看目录中子目录占用空间大小
  • YK人工智能(二)——万字长文了解深度学习环境配置
  • grep如何打印行数
  • C++线程池的使用
  • 智能商业分析 Quick BI
  • Spring Security 3.0.2.3版本
  • 为什么需要设置 `NCCL_P2P_DISABLE=1` 和 `NCCL_IB_DISABLE=1`?
  • 4G报警器WT2003H-16S低功耗语音芯片方案开发-实时音频上传
  • 国产低代码框架zdppy开发笔记001 zdppy_api快速入门
  • 《鸿蒙HarmonyOS应用开发从入门到精通(第2版)》学习笔记——HarmonyOS架构介绍
  • 力扣-数据结构-8【算法学习day.79】
  • 石岩路边理发好去处
  • Kerberos用户认证-数据安全-简单了解-230403
  • 二十三种设计模式-工厂方法模式
  • 【UE5】UnrealEngine源码构建1:tag为5.3.2源码clone
  • 与你共度的烟火日常