有效三角形的个数【双指针】

news2024/12/29 13:32:27

在这里插入图片描述

1.优化版暴力求解

如果能构成三⻆形,需要满⾜任意两边之和要⼤于第三边。实际上只需让较⼩的两条边之和⼤于第三边即可。将原数组排序,从⼩到⼤枚举三元组,这样三层 for 循环枚举出的三元组只需判断较⼩的两条边之和是否⼤于第三边。

class Solution
{
public:
    int triangleNumber(vector<int> &nums)
    {
        sort(nums.begin(), nums.end());

        int n = nums.size(), ret = 0;
        for (int i = 0; i < n; i++)
        {
            for (int j = i + 1; j < n; j++)
            {
                for (int k = j + 1; k < n; k++)
                {
                    if (nums[i] + nums[j] > nums[k])
                        ret++;
                }
            }
        }
        return ret;
    }
};

2.排序+二分

在 [j+1,n−1] 的下标范围内使用二分查找,找出最大的满足 nums[k]<nums[i]+nums[j]的下标 k,在 [j+1,k] 范围内的下标都可以作为边 c 的下标,将该范围的长度 k−j 累加。在枚举a和b时出现了0,那么 nums[i] 一定为 0。边c需要满足c< nums[i]+ nums[j]= nums[j],而下标在[j+1,n-1]范围内的元素一定都是大于等于 nums[j]的,因此二分查找会失败。若二分查找失败,我们可以令k=j,此时对应的范围长度k-j=0,我们也就保证了答案的正确性。

class Solution
{
public:
    int triangleNumber(vector<int> &nums)
    {
        int n = nums.size();
        sort(nums.begin(), nums.end());

        int ret = 0;
        for (int i = 0; i < n; ++i)
        {
            for (int j = i + 1; j < n; ++j)
            {
                int left = j + 1, right = n - 1, k = j;
                while (left <= right)
                {
                    int mid = (left + right) / 2;
                    if (nums[mid] < nums[i] + nums[j])
                    {
                        k = mid;
                        left = mid + 1;
                    }
                    else
                    {
                        right = mid - 1;
                    }
                }
                ret += k - j;
            }
        }
        return ret;
    }
};

3.排序+双指针

此法是对上述两种方法的优化。
排序过后数组数据为递增排列。

首先我们先来看这样一个数学常识:

将一个递增排序的数组分为两部分:
在这里插入图片描述

  1. 如果此时有Left + Right > Max 那么
    Right + Right-1
    Right + Right-2
    Right + …
    Right + Left
    的值都大于Max。那么能够构成的二元组个数为right - left个
    此时 right 位置元素的所有情况相当于全部考虑完毕, right – ,进⼊下⼀轮判断
  2. 同上,如果 nums[left] + nums[right] <= nums[i] ,说明 left 位置的元素是不可能与 [left + 1, right] 位置上的元素构成满⾜条件的⼆元组,left 位置的元素可以舍去, left++ 进⼊下轮循环。

代码

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1549079.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024/3/24周报

文章目录 摘要Abstract文献阅读题目引言创新点数据处理研究区域和数据缺失值处理水质相关分析 方法和模型LSTMAttention机制AT-LSTM模型 实验结果 深度学习transformer代码实现1 模型输入1.1 Embedding层1.2 位置编码 2 Encoder2.1 编码器2.2 编码器层2.3注意力机制2.4多头注意…

Sora那么牛,他的模型的成本会有多少呢?

Sora的训练需要大量的计算资源&#xff0c;估计需要4211-10528个 Nvidia H100 GPUs运行一个月。推理成本&#xff1a;一个Nvidia H100 GPU大约每小时能生成5分钟的视频。初期的Sora成本将非常高&#xff0c;肯定是不适合普通人来使用&#xff0c;所以目前OpenAI都是先找一些艺术…

AttributeError: ‘ImageDraw‘ object has no attribute ‘textsize‘

用python绘制词云图时&#xff0c;出现报错AttributeError: ImageDraw object has no attribute textsize&#xff0c;应当如何解决&#xff1f; - CSDN文库

TikTok养号怎么做?打破0播放的前提是做好这些

TikTok养号的重要性不必多少&#xff0c;不仅可以在创号初期保障账号安全&#xff0c;后期的账号流量也需要以前期养好账号为前提。下面就给大家分享如何养号的真实操作攻略&#xff01; 一、为什么要养号 &#xff08;1&#xff09;提高系统推荐精准度 系统不了解新账户人设…

基于单片机病房温度监测与呼叫系统设计

**单片机设计介绍&#xff0c;基于单片机病房温度监测与呼叫系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机病房温度监测与呼叫系统设计概要主要涵盖了通过单片机技术实现病房温度的实时监测以及病人呼叫功能…

如何应对Android面试官->进程通信如何注册与获取服务

前言 大家好&#xff0c;我是老A&#xff1b; 这个章节继续上一章节继续讲解&#xff0c;主要讲解下 java 层服务的注册与获取、线程池&#xff1b;我们基于 AMS 来看下 java 层是如何获取的&#xff1b; SystemServer SystemServer 的启动也是 main 函数&#xff0c;我们进入…

三、阅读器开发--4、阅读器目录、全文搜索功能开发

1、阅读器目录 1.1、实现目录 先实现目录的布局 定义一个蒙版&#xff0c;充满整个屏幕浮在阅读器上方&#xff0c;左侧为目录右侧为背景&#xff0c;目录下方包含一个tab&#xff0c;点击后会切换不同的内容&#xff0c;这里tab是目录、书签&#xff0c;这里可以通过如下的…

(原型与原型链)前端八股文修炼Day5

一 原型链的理解 原型链定义&#xff1a; 原型链是 JavaScript 中实现对象继承的关键机制之一&#xff0c;它是一种对象之间的关系&#xff0c;通过这种关系&#xff0c;一个对象可以继承另一个对象的属性和方法。 原型链的组成&#xff1a; 每个对象都有一个指向另一个对象的…

【node】express使用(三)

1、express.static快速托管静态资源 express:快速、开放、极简的Web开发框架。(npm第三方包&#xff0c;提供快速创建web服务器便捷方法) Express中文官网 (1) express快速创建web网站服务器以及api接口服务器 // 1、导入express const express require(express) // 2、创…

ITES | 深圳工业展正运动重磅产品即将亮相

■展会名称&#xff1a; 第二十五届深圳国际工业制造技术及设备展览会&#xff08;以下简称“深圳工业展”&#xff09; ■展会日期 2024年3月28日-31日 ■展馆地点 中国深圳国际会展中心(宝安) ■展位号 9号馆F04 2024年深圳工业展(ITES)将于3月28日至31日在深圳宝安国…

Android Studio详细安装教程及入门测试

Android Studio 是 Android 开发人员必不可少的工具。 它可以帮助开发者快速、高效地开发高质量的 Android 应用。 这里写目录标题 一、Android Studio1.1 Android Studio主要功能1.2 Android应用 二、Android Studio下载三、Android Studio安装四、SDK工具包下载五、新建测试…

20240320-1-梯度下降

梯度下降法面试题 1. 机器学习中为什么需要梯度下降 梯度下降的作用&#xff1a; 梯度下降是迭代法的一种&#xff0c;可以用于求解最小二乘问题。在求解损失函数的最小值时&#xff0c;可以通过梯度下降法来一步步的迭代求解&#xff0c;得到最小化的损失函数和模型参数值。…

阶乘的最高位

阶乘的最高位 题目描述 输入一个正整数n。输出n!的最高位上的数字。 输入 输入一个正整数n&#xff08;n不超过1000&#xff09;。 输出 输出n!的最高位上的数字。 样例输入 1000样例输出 4解 这道题要是求阶乘的后三位或者后几位&#xff0c;大家肯定都会。 求最高…

web服务应用术语

一、HTTP 协议详解 TCP 协议与 HTTP 协议 TCP 协议主要用于数据传输控制&#xff0c;而 HTTP 协议主要用于应用层面的数据交互。 HTTP 属于应用层协议&#xff0c;是建立在 TCP 协议基础之上的&#xff0c;HTTP 协议以客户端请求和服务器端响应为标准&#xff0c;浏览器通常称…

JavaSE+JDBC进行控制台输出的客户管理系统! (实训/课堂实践推荐)

本人博客&#xff1a;玖玖的个人博客 (zhangxi.online)&#xff0c;欢迎大家来踩 该文章原地址&#xff1a; JavaSEJDBC进行控制台输出的客户管理系统! (实训/课堂实践推荐&#xff09; (zhangxi.online) 本人诚挚的特别感谢&#xff1a;尚硅谷/黑马程序员提供的学习案例 项…

玩转云计算:教你在Akamai Linode上构建IT架构–定义项目

时至今日&#xff0c;选择以云计算方式来运维业务&#xff0c;已经成为大部分情况下的最优选。那么如果要从零开始开发一个新应用&#xff0c;并依托云平台来设计、开发、部害和远维&#xff0c;具体该从何处下手&#xff1f;这一系列文章将介绍如何基于Akamai Linode平台实现这…

通过Appium和Xcode Accessibility Inspector获取iOS应用元素定位的方法

在 iOS 移动应用程序上使用选择器查找元素定位是我们在移动端 UI 自动化测试的先决条件。 但是&#xff0c;由于应用程序内容在原生 iOS 应用程序中的呈现方式&#xff0c;我们可以用来定位应用程序元素的选择器与 Web 浏览器元素有很大不同。 在本文中&#xff0c;我们将了解 …

将markdown文档中的图床外链图片下载到本地文件夹

markdown图床外链图片下载到本地代码 前言 因为文章发到先知或者攻防社区需要本地图片&#xff0c;而我的图片从来都是上传到图床&#xff0c;所以编写了一个脚本实现了把markdown文章中所有含有外链图床的图片转储到本地的文件夹。 然后发布文章时再手动一个个上传图片。 详细…

STM32的IAP计数,BootLoader

来源 三种下载方式&#xff1a; 1、ICP&#xff1a;ST-Link, 2、ISP: FlyMcu, 3、IAP IAP简介 IAP技术的核心在于BootLoader程序的设计&#xff0c;这段程序预先烧录在单片机中&#xff0c;正常的APP程序可以使用BootLoader程序中的IAP功能写入&#xff0c;也可以两部分代码一…

comfyui 代码结构分析

comfyui的服务器端是用aiohtttp写的&#xff0c;webui是fastapi直接构建的&#xff0c;但是其实comfyui的这种设计思路是很好的&#xff0c;也许我们不需要在后端起一个复杂的前台&#xff0c;但是可以借助json结构化pipeline&#xff0c;然后利用node节点流把整个流程重新映射…