初识算法 · 双指针(2)

news2024/11/17 5:36:05

目录

前言:

盛最多水的容器

题目解析:

算法原理:

算法编写:

有效三角形的个数

题目解析:

算法原理:

算法编写:


前言:

本文介绍两个题目,盛最多水的容器和有效三角形的个数,对应的Leetcode的题目链接为:

11. 盛最多水的容器 - 力扣(LeetCode)

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

介绍这两个题目,会从两角度进行介绍,暴力解法以及算法,整个题目的讲解分为三个部分,题目解析,算法原理,算法编写三个部分进行讲解。

现在就进入正题吧!


盛最多水的容器

题目解析:

 题目:

题目实例:

该题目的要求是找到最大的值,值的求法为下标相减 * 两数中小的那个数,那么我们可以不管三七二十一,直接暴力,即将所有的值都给求出来,自然是两个循环就可以解决了,伪代码为:

for(...)
{

    //确定左边的边长

    for(...)

    {

        //确定右边的边长

    }

}

虽然说最后求值部分是一个等差数列的求和方式,但是不影响,最终的时间复杂度依旧是O(N^2)

对于为什么求值是*两数中较小的那个数,木桶效应相信大家都是听说过的:

即一个木桶盛水的容量不是取决于最长的木板,而是最短的那个木板,所以求值的时候是最小的那个值。

算法原理:

在算法原理部分,我们已经在上文了解了暴力解法,所以不再赘述暴力解法,这里是找两个数,保证下标相减 * 最小的那个数是最大值,那么找两个数,我们不妨使用双指针来解决。

容量大小 = 两数中的较小值 * 下标之差

我们不妨规定左指针从0开始,右指针从size - 1开始,如果我们从同向的方向进行判断,那么就会存在两变量,下标之差可能增大可能减少,较小值不确定,就会有4种情况,是比较难控制的,如果是我们定向的让右指针从右边开始,即数组的最末端,随着右指针往左或者是左指针往右,都是下标之差减少的过程,那么我们为了找最大值,需要保证的就是两个数之间的规则了。

谁小谁就移动,并且我们需要记录移动之前的容量大小,记录之后,需要比较移动之后的容量大小。我们取最大的即可。

算法编写:

class Solution 
{
public:
    int maxArea(vector<int>& height)
    {
        int left = 0, right = height.size() - 1;
        int ret = 0,ans = 0;
        while(right > left)
        {
            ret = min(height[left],height[right]) * (right - left);
            ans = max(ret,ans);
            if(height[left] > height[right]) right--;
            else left++;
        }
        return ans;
    }
};

此时就完美通过了。


有效三角形的个数

题目解析:

题目:

题目示例:

通过示例,我们可以得出来一个结论是:下标不同数值相同的元素我们可以使用,即便组成的三角形是一样的。根据题目要求,我们首先得到的一个信息是,我们需要通过判断获取到的三个元素是否能构成三角形,那么根据初中的理论,三角形的充要条件是:任意两边之和大于第三边。

难道我们判断三角形的时候,就都要写三个条件吗?那是不是有点太麻烦了?这点先不管,题目中还有的提示是数组是非负的整数数组,也就是不会出现非整数和负数,我们返回值是能构成三角形的个数。题目要求不多,解析到这里已经差不多了。

算法原理:

还是那句话,遇事不决先暴力。

这道题的暴力解法是很简单的,我们只需要三个循环,一个循环找一条边即可:

for()
{
    for()
    {
        for()
        {
            //判断三角形是否成立
        }
    }
}

但是时间复杂度也是惊人的高,达到了O(N^3),一般leetcode上这种题,到最后几个样例的时候,O(N^3)一般都是会超时的。

所以我们需要另辟蹊径,那么就使用双指针算法,对于双指针来说,影响的是两个数,这是可是三个数,我们应该如何操作呢?

我们不妨借助单调性,如果借助单调性,我们碰见一组数,我们就要判断是否为三角形,这是否太麻烦了?那么有了单调性,比如a + b > c,随着指针往右边走,两个小的数都大于c了,其他的数还能不大于吗?到那个地步我们可以直接ans = 下标之差了,后面的肯定是符合条件的。那么c为最大边的所有三角形找到了,--即可。

算法编写:

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

此时的时间复杂度为O(N^2),相对于O(N^3),是一个非常大的提升。

以上就是两道算法题目的详解。


感谢阅读!

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

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

相关文章

Excel下拉菜单制作及选项修改

Excel下拉菜单 1、下拉菜单制作2、下拉菜单修改 下拉框&#xff08;选项菜单&#xff09;是十分常见的功能。Excel支持下拉框制作&#xff0c;通过预设选项进行菜单选择&#xff0c;可以避免手动输入错误和重复工作&#xff0c;提升数据输入的准确性和效率 1、下拉菜单制作 步…

留存率的定义与SQL实现

1.什么是留存率 留存率是指在特定时间段内&#xff0c;仍然继续使用某项产品或服务的用户占用户总数的百分比。 通常&#xff0c;留存率会以日&#xff0c;周&#xff0c;或月为单位进行统计和分析。 2.SQL留存率常见问题 1.计算新用户登录的日期的次日留存率以及3日留存率 …

【鸿蒙学习】深入了解UIAbility组件

文章目录 组件概述生命周期启动模式基本用法 在鸿蒙操作系统&#xff08;HarmonyOS&#xff09;的开发过程中&#xff0c;UIAbility组件是构建应用界面的关键。本文将带您了解UIAbility组件的概述、生命周期、启动模式以及基本用法&#xff0c;并通过代码示例帮助您更好地掌握这…

微信互助学习平台|互助学习平台系统|基于java的微信互助学习平台设计与实现(源码+数据库+文档)

微信互助学习平台 目录 基于java的微信互助学习平台设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师…

论文阅读- On the Feasibility of Fully AI-automated Vishing Attacks

https://arxiv.org/pdf/2409.13793 目录 摘要 INTRODUCTION II. GOALS AND THREAT MODEL III. VIKING A. Architecture B. Interaction with the LLM C. Audio processing D. Call processing E. Implementation IV. EVALUATION METHODOLOGY A. Experiment design …

NeRF三维重建—神经辐射场

NeRF—神经辐射场 本文介绍了三维重建相关技术&#xff0c;特别是神经辐射场(NeRF)的进步&#xff0c;它通过深度学习实现逼真的三维场景重建。NeRF在计算机图形学、自动驾驶和元宇宙等领域展现出广阔的应用前景&#xff0c;通过改进传统方法&#xff0c;提供更高质量的渲染和沉…

聊聊国内首台重大技术装备(1)

9.9日&#xff0c;工信部发布了《首台&#xff08;套&#xff09;重大技术装备推广应用指导目录&#xff08;2024年版&#xff09;》&#xff0c;在集成电路领域&#xff0c;公布了如下首台机台设备&#xff0c;这确实是一个十分振奋人心的消息&#xff0c;说明我国在半导体制造…

LSTM模型实现光伏发电功率的预测

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有&#xff1a;中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等&#xff0c;曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝&#xff0c;拥有2篇国家级人工智能发明专利。 社区特色…

构造函数继承

构造函数继承 主要通过在子类的构造函数中调用父类的构造函数&#xff0c;绑定子类实例的 this&#xff0c;从而实现子类对父类属性的继承。这种方法避免了父类和子类共享原型链上的属性&#xff0c;并且可以传递参数给父类的构造函数。 构造函数继承的实现步骤&#xff1a; …

Windows远程Kylin系统-VNC

Windows远程Kylin系统-VNC 一. 配置 yum源 二. 清理yum缓存 三. 安装VNC并配置 nkvers yum install tigervnc tigervnc-server -ycp /lib/systemd/system/vncserver.service /etc/systemd/system/vncserver:1.service 说明&#xff1a;vncserver:1.service中的&#xff1a;1表…

Windows 环境下安装 Anaconda 并适配到 PowerShell 的保姆级教程

Anaconda Anaconda 是一个流行的 Python 数据科学和机器学习平台&#xff0c;它包括了 Conda 包管理器、Python 以及数百个用于科学计算的库和工具。Anaconda 旨在简化包和环境管理&#xff0c;使得安装、更新和管理软件包变得容易&#xff0c;同时也能够轻松创建和切换不同的P…

案例-百度热榜页面实现

文章目录 效果展示要求内容注意代码内容 效果展示 要求内容 整个盒子大小&#xff1a;536*536标题字体柜20px、加粗&#xff0c;纯黑&#xff0c;换一换字体大小20px、颜色0055db、刷新图标是本地图片内容字体18px、上下边距15px、下边框实心2px颜色f3f3f3这个需要根据页面显示…

【顺序查找】

目录 一. 顺序查找的概念二. 查找的性能计算 \quad 一. 顺序查找的概念 \quad \quad 二. 查找的性能计算 \quad

【LLM论文日更】| 通过指令调整进行零样本稠密检索的无监督文本表示学习

论文&#xff1a;https://arxiv.org/pdf/2409.16497代码&#xff1a;暂未开源机构&#xff1a;Amazon AGI、宾夕法尼亚州立大学领域&#xff1a;Dense Retrieval发表&#xff1a;Accepted at DCAI24 workshopCIKM2024 研究背景 研究问题&#xff1a;这篇文章要解决的问题是如…

Linux学习笔记(三):文件管理、复杂操作与实用工具详解

Linux学习笔记&#xff08;三&#xff09;&#xff1a;文件管理、复杂操作与实用工具详解 Linux 学习笔记&#xff08;二&#xff09;&#xff1a;深入理解用户管理、运行级别与命令行操作 1.文件操作的基本操作 1.1 创建 创建目录 mkdir&#xff1a;创建目录 mkdir /home/d…

【MySQL】多表联合查询常见练习题

数据库表如下&#xff1a; teacher&#xff1a;老师表 course&#xff1a;课程表 student&#xff1a;学生表 class&#xff1a;班级表 sc&#xff1a;成绩表 一、根据上面5张表写sql语句 1. 查询” 01 “课程比” 02 “课程成绩高的学生的信息及课程分数 select student.…

AI智能时代的图书馆未来,你想象过吗!

AI智能时代的图书馆未来&#xff0c;你想象过吗&#xff01; 前言AI智能时代的图书馆未来 前言 教育数字化和 AI 时代的浪潮正汹涌而来&#xff0c;图书馆也站在了变革的十字路口。我们看到高等教育正在发生深刻的变革&#xff0c;从教学模式到人才培养理念&#xff0c;都在经…

基于SSM+VUE的学生宿舍管理系统

文未可获取一份本项目的java源码和数据库参考。 随着社会经济的迅速发展和科学技术的全面进步&#xff0c;计算机事业的飞速发展&#xff0c;以计算机与通信技术为基础的信息系统正处于蓬勃发展的时期&#xff0c;当今社会正快速向数字化&#xff0c;信息化&#xff0c;网络化…

VSCode开发Vue3+TS项目中遇到各种波浪线(诊断信息)

一、问题汇总 在使用Visual Studio Code&#xff08;VSCode&#xff09;开发Vue3 TypeScript项目时&#xff0c;会遇到各种波浪线错误&#xff08;诊断信息&#xff09;&#xff0c;这些问题或错误通常由以下几人原因引起的&#xff1a; 1.1 常见问题 1、typeScript配置问题…

【探索 GDB 和 CGDB】:强大的调试工具介绍

&#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;Linux—登神长阶 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f49e; &#x1f49e; &#x1f49e; 1. 引言&#x1f4c3; 1.1 …