双指针_有效三角形个数三数之和四数之和

news2024/11/27 22:33:15

有效三角形个数

思路:
 

我们可以通过暴力枚举,三重for循环来算但,时间复杂度过高。

有没有效率更高的算法呢?

我们知道如果两条较短的边小于最长的一条边,那么就可以构成三角形。

如果这个数组是升序的,两条较大的边的值事先知道,最小的边从下标0开始找,不能构成三角形就向前移直到构成三角形,此时前面的元素都是大于等于它的 所以肯定也可以构成三角形。

顺着这个思路来写:

1.先对vector排升序

2.cur指向最大值,right指向cur-1,left指向下标0。如果left+right<=cur,那么构不成三角形,left++移向下一个值。

反之left+right>cur,left指向的元素以及left~right之间的元素都是可以构成三角形的,count+=right-left记录可以构成的元素个数,right--进入下一轮直到left==right。

3.内部循环结束后,可以和cur指向的元素构成三角形的情况统计结束,重新赋值left,right ,cur--直到指向下标为 2的位置。

代码实现:

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

三数之和(medium)

https://leetcode.cn/problems/3sum/submissions/570394385/

我们做过两数和为x的题,那三数和为0,就是求两数和等于第三个数的相反数。

我们可以先固定一个数,再去找两数和等于固定数的相反数。

注意:题目中不可以输出相同的三元组

思路一:三层for循环+set去重

思路二:排序+双指针+去重

对数组进行sort排序,先固定第一个数下标为 i,再从后面区间[i+1,end]找和为nums[i]相反数的两个数。如果nums[i]>0即最小数都>0,三数和不可能==0,直接break

1.两数和大于它,左边++

2.小于,右边--

3.等于,记录后,左边++,右边--。如果左边是数和上一个数一样,那就会出现重复的情况,就需要再++,直到不同。注意不要越界。同理,右边也一样。

完成一轮循环后,i++,换到第二个数。如果第二个数和第一个数一样,也没必要进行查找,也要进行去重操作。直到不足3个数就不进行循环.

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> ret;
        //排序
        sort(nums.begin(),nums.end()); 
        //至少3个数才能进行循环
        for(int i=0;i<nums.size()-2;) 
        {
            if(nums[i]>0) break;//最小数为正数和不可能为0
            int left=i+1,right=nums.size()-1;//查找区间
            int target=-nums[i];
            //在区间内找2数和为target的数
            while(left<right)
            {
                if(nums[left]+nums[right]<target) left++;
                else if(nums[left]+nums[right]>target) right--;
                else 
                {
                    ret.push_back({nums[i],nums[left],nums[right]});
                    left++;right--;
                    //去重
                    while(left<right&&nums[left]==nums[left-1]) left++;
                    while(left<right&&nums[right]==nums[right+1]) right--;
                }
            }
            i++;
            //去重
            while(i<nums.size()-2&&nums[i]==nums[i-1]) i++;
        }
        return ret;
    }
};

四数之和(medium)

https://leetcode.cn/problems/4sum/submissions/570424616/

四数取和是在三数取和的基础上再固定一个数,也就是两层for循环,再用双指针。

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> ret;
        sort(nums.begin(),nums.end());
        for(int i=0;i<(int)nums.size()-3;)
        {
           for(int j=i+1;j<(int)nums.size()-2;)
           {
            int left=j+1,right=(int)nums.size()-1;
            long long tar=(long long)target-nums[i]-nums[j];
            while(left<right)
            {
                int sum=nums[left]+nums[right];
                if(sum>tar) right--;
                else if(sum<tar) left++;
                else 
                {
                    ret.push_back({nums[i],nums[j],nums[left],nums[right]});
                    left++;right--;
                    //去重
                    while(left<right&&nums[left]==nums[left-1]) left++;
                    while(left<right&&nums[right]==nums[right+1]) right--;
                }
            }
            j++;
            while(j<(int)nums.size()-2&&nums[j]==nums[j-1]) j++;
           }
            i++;
            while(i<(int)nums.size()-3&&nums[i]==nums[i-1]) i++;
        }
        return ret;
    }
};

需要注意的是,计算tar时,数据可能会超出int范围,建议使用long long.

可以先减去两个固定的数再进行比较。

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

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

相关文章

负压DC-DC开关电源设计

负压DC-DC开关电源设计 与常见的正压输出BUCK电路对比&#xff0c;区别就在于将 原芯片接GND的网络接到了负压输出。 电感一接sW引脚&#xff0c;另外一接到了OV-GND。 注意几点如下: 芯片耐压选择 EN引脚耐压 输入滤波电容的选择 拓扑结构 BOOST模式&#xff1a;当NMO…

NXP i.MX8系列平台开发讲解 - 4.2.3 摄像头篇(三) - 摄像头MIPI 接口

专栏文章目录传送门&#xff1a;返回专栏目录 Hi, 我是你们的老朋友&#xff0c;主要专注于嵌入式软件开发&#xff0c;有兴趣不要忘记点击关注【码思途远】 文章目录 关注星号公众号&#xff0c;不容错过精彩 作者&#xff1a;HywelStar 1. 概述 MIPI是Mobile Industry Pr…

论文阅读:InternVL v1.5| How Far Are We to GPT-4V? 通过开源模型缩小与商业多模式模型的差距

论文地址&#xff1a;https://arxiv.org/abs/2404.16821 Demo&#xff1a; https://internvl.opengvlab.com Model&#xff1a;https://huggingface.co/OpenGVLab/InternVL-Chat-V1-5 公开时间&#xff1a;2024年4月29日 InternVL1.5&#xff0c;是一个开源的多模态大型语言模…

【无人机设计与控制】基于matlab的无人机FMCW(频率调制连续波)毫米波高度计雷达仿真

摘要 本文介绍了一种基于FMCW&#xff08;频率调制连续波&#xff09;雷达技术的无人机毫米波高度计的仿真。FMCW雷达通过测量发射信号与回波信号之间的频差来确定目标的距离和速度。在本项目中&#xff0c;我们使用MATLAB仿真无人机毫米波雷达的性能&#xff0c;展示其在不同…

TS1 order set分析

如下图&#xff0c;所示为TS1 order序列。该序列有16个symbol组成。 常见的symbol有&#xff0c;PAD和COM等。PAD是K symbol&#xff0c;还有D symbol。下文先给出COM symbol的解读。读协议文档可知COM常被称为K28.5。K是symbol的类型&#xff0c;注意symbol是编码过的数据。K…

六、Java 基础语法(下)

一、变量 1、变量的定义与使用 变量就是内存中的存储空间&#xff0c;空间中存储着经常发生改变的数据变量定义格式&#xff1a; 数据类型 变量名 数据值使用时根据变量名使用举例如下&#xff0c;上面是代码&#xff0c;下面是输出 2、变量的注意事项 变量名不允许重复…

Dyna-slam复现(保姆级详细图文版,百分百成功)

因最近论文要和这些算法做对比,故配置了一下,在此记录 因为是老的算法,cuda版本现在的显卡都不能使用,所以笔者找的电脑是华硕飞行堡垒17年的电脑,1080的显卡 深度学习及maskrcnn配置 先将dyna-slam git下来,终端执行 git clone https://github.com/BertaBescos/Dyna…

Arduino UNO R3自学笔记21 之 Arduino电机的闭环控制

注意&#xff1a;学习和写作过程中&#xff0c;部分资料搜集于互联网&#xff0c;如有侵权请联系删除。 前言&#xff1a;上篇写了电机速度测定&#xff0c;这篇主要是讲测定出的速度用于反馈&#xff0c;使得实际速度快速响应到需要的速度。 1.控制系统介绍 分2大类&#x…

ECML PKDD 2024 | 时空数据(Spatial-Temporal)和时间序列(Time series)论文总结

ECML PKDD 2024于9月9号-9月13号在立陶宛维尔纽斯举行&#xff08;Vilnius&#xff09; 本文总结了ECML PKDD 2024有关时空数据&#xff08;spatial-temporal data&#xff09;的相关论文&#xff0c;主要包含交通预测&#xff0c;预训练&#xff0c;迁移学习等内容&#xff0…

latex本地运行(MiKTeX+VScode)-20241006

1、安装 LaTex 主流的分发版本应该就是 TeXLive 和 MikTeX 了,这里使用 MikTex(只有几百M)—— TeXLive 太大了、默认安装全部包,可选自选部分安装单实在有些许麻烦,MikTeX 则方便得多,需要的时候可以自动安装全部包 点击跳转到 MiKTeX 官网,直接下载即可:不用担心什…

jQuery——事件委托

1、事件委托(委派/代理): 将多个子元素的事件监听委托给父辈元素处理监听回调是加在了父辈元素上当操作任何一个子元素 时&#xff0c;事件会冒泡到父辈元素父辈元素不会直接处理事件&#xff0c;而是根据 event.target 得到发生事件的子元素&#xff0c;通过这个子元素调用事…

微信第三方开放平台接入本地消息事件接口报错问题java.security.InvalidKeyException: Illegal key size

先看报错&#xff1a; java.security.InvalidKeyException: Illegal key sizeat javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1039)at javax.crypto.Cipher.implInit(Cipher.java:805)at javax.crypto.Cipher.chooseProvider(Cipher.java:864)at javax.crypto.Cipher.in…

Spring MVC__@RequestMapping注解、获取请求参数、域对象共享数据、视图、Restful

目录 一、RequestMapping注解1、RequestMapping注解的功能2、RequestMapping注解的位置3、RequestMapping注解的value属性4、RequestMapping注解的method属性5、RequestMapping注解的params属性&#xff08;了解&#xff09;6、RequestMapping注解的headers属性&#xff08;了解…

登 Nature 子刊!论文一作详解蛋白质语言模型的小样本学习方法,解决湿实验数据匮乏难题

在「Meet AI4S」系列直播第三期中&#xff0c;我们有幸邀请到了上海交通大学自然科学研究院 & 上海国家应用数学中心博士后周子宜&#xff0c; 他所在的上海交通大学洪亮课题组研究方向主要为 AI 蛋白和药物设计、分子生物物理。该课题组研究成果颇丰&#xff0c;截止目前共…

小程序图片资源等使用阿里服务链接更新问题

同名更换图片&#xff0c;小程序无需发版本更新&#xff0c;存在图片缓存问题解决方法 修改Cache-Control参数即可

一个真实可用的登录界面!

需要工具&#xff1a; MySQL数据库、vscode上的php插件PHP Server等 项目结构&#xff1a; login | --backend | --database.sql |--login.php |--welcome.php |--index.html |--script.js |--style.css 项目开展 index.html&#xff1a; 首先需要一个静态网页&#x…

双十一适合买什么东西?数码好物推荐指南!

​临近双十一&#xff0c;我猜很多朋友已经为双11做好了准备&#xff0c;打算开启买买买的节奏了&#xff01;都想着趁着双十一把平时因为价格太贵舍不得下单的东西彻底拿下&#xff01;作为一名数码博主&#xff0c;每年双11的时候都会疯狂囤很多物品&#xff0c;所以今天就跟…

创始人模式--格雷厄姆

以下是 Paul Graham 的文章《创始人模式》的翻译&#xff1a; 创始人模式 2024 年 9 月 上周在一个 Y Combinator 的活动中&#xff0c;Brian Chesky 做了一个演讲&#xff0c;在场的每个人都会记住。我之后与大多数创始人交谈时&#xff0c;他们都说这是他们听过的最好的演…

pytorch基础:模型的权值初始化与损失函数

文章目录 一、权值初始化1.2Kaiming初始化1.4 十种权重初始化方法 2.损失函数2.1损失函数初步介绍2.2交叉熵损失CrossEntropyLoss 2.3 剩余的17种损失函数介绍 一、权值初始化 在搭建好网络模型之后&#xff0c;一个重要的步骤就是对网络模型中的权值进行初始化。适当的权值初…

SpringBoot框架在明星周边销售网站中的应用

3系统分析 3.1可行性分析 通过对本星之语明星周边产品销售网站实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本星之语明星周边产品销售网站采用JAVA作为开发语…