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

有效三角形个数

思路:
 

我们可以通过暴力枚举,三重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;//最小数为正数和不可能为0int 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.mzph.cn/diannao/55502.shtml

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

相关文章

python交互式命令时如何清除

在交互模式中使用Python&#xff0c;如果要清屏&#xff0c;可以import os&#xff0c;通过os.system()来调用系统命令clear或者cls来实现清屏。 [python] view plain copy print? >>> import os >>> os.system(clear) 但是此时shell中的状态是&#xff1a;…

鼓组编写:SsdSample鼓映射 GM Map 自动保存 互换midi位置 风格模板 逻辑编辑器

SsdSample音源的键位映射 方便编写鼓的技巧 可以这样去设置键位关系的面板和钢琴卷帘窗的面板&#xff0c;方便去写鼓。 可以先按GM的midi标准去写鼓&#xff0c;然后比对下鼓的键位映射的关系&#xff0c;去调整鼓。 可以边看自己发b站等处的图文笔记&#xff0c;然后边用电…

iptables 的NDAT报错bash: 9000: command not forward

外网主机设置&#xff1a; iptables -t nat -A PREROUTING -d 192.168.3.51 -p tcp --dport 9000 -j DNAT --to-destination 192.168.3.61:22 本地shell连接&#xff1a; PS C:> ssh root192.168.3.51 9000 显示如下操作&#xff1a; PS C:> ssh root192.168.3.51 9000…

Linux 位置无关(PIC)代码和代码重定位(relocate)

在 Linux 和其他 Unix-like 操作系统中&#xff0c;位置无关代码&#xff08;Position Independent Code, PIC&#xff09;和代码重定位&#xff08;Relocation&#xff09;是两个重要的概念&#xff0c;它们对于共享库、动态链接和执行效率有着至关重要的影响。下面将详细介绍…

谷歌开源AI统计学专家DataGemma

谷歌开源AI统计学专家DataGemma&#xff1a;引领大数据时代的精准决策 在数字化浪潮席卷全球的今天&#xff0c;人工智能&#xff08;AI&#xff09;已成为推动社会进步的重要力量。其中&#xff0c;大语言模型&#xff08;LLM&#xff09;作为AI领域的前沿技术&#xff0c;以其…

CTFshow 命令执行 web29~web36(正则匹配绕过)

目录 web29 方法一&#xff1a;include伪协议包含文件读取 方法二&#xff1a;写入文件 方法三&#xff1a;通识符 web30 方法一&#xff1a;filter伪协议文件包含读取 方法二&#xff1a;命令执行函数绕过 方法三&#xff1a;写入文件 web31 方法一&#xff1a;filter伪…

基于Springboot+Vue的零食批发商仓库管理系统(含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 在这个…

关键字:sizeof

1.sizeof sizeof&#xff1a;确定一种类型&#xff0c;对应在开辟空间的时候的大小&#xff1b; 1.1求内置类型 printf("%d\n",sizeof(char)); //这些学过C语言的基本都没问题 printf("%d\n",sizeof(short)); printf("%d\n",sizeof(int…

Open-Sora全面开源?

来源 | 机器之心 ID | almosthuman2014 不久前 OpenAI Sora 以其惊人的视频生成效果迅速走红&#xff0c;在一众文生视频模型中突出重围&#xff0c;成为全球瞩目的焦点。继 2 周前推出成本直降 46% 的 Sora 训练推理复现流程后&#xff0c;Colossal-AI 团队全面开源全球首个类…

03 去重排序

题目&#xff1a; 桶排序变体&#xff1a; #include<iostream> #include<algorithm> using namespace std; #define M 100005 int a[M];int main() {int N;cin>>N;int count0;for(int i1;i<N;i){int temp;cin>>temp;if(a[temp]1){continue;}else{a…

Vue中watch监听属性的一些应用总结

【1】vue2中watch的应用 ① 简单监视 在 Vue 2 中&#xff0c;如果你不需要深度监视&#xff0c;即只需监听顶层属性的变化&#xff0c;可以使用简写形式来定义 watch。这种方式更加简洁&#xff0c;适用于大多数基本场景。 示例代码 假设你有一个 Vue 组件&#xff0c;其中…

vue双向绑定/小程序双向绑定区别

Vue双向绑定与小程序双向绑定在实现方式、语法差异以及功能特性上均存在显著区别。以下是对这两者的详细比较&#xff1a; 一、实现方式 Vue双向绑定 Vue的双向绑定主要通过其响应式数据系统实现。Vue使用Object.defineProperty()方法&#xff08;或在Vue 3中使用Proxy对象&am…

MindSearch 部署到Github Codespace 和 Hugging Face Space

一&#xff1a;概述 MindSearch是一个创新的AI搜索框架&#xff0c;由中国科技大学的科学家以及上海人工智能实验室的学者联合研发。 随着硅基流动提供了免费的 InternLM2.5-7B-Chat 服务&#xff08;免费的 InternLM2.5-7B-Chat 真的很香&#xff09;&#xff0c;MindSearch 的…

Spring Cloud之OpenFeign的具体实践

1 基本概念 OpenFeign基于Feign框架开发&#xff0c;而Feign是Netflix开源的一个声明式Web服务客户端。OpenFeign通过定义接口、注解和动态代理等方式&#xff0c;将服务调用的过程封装起来&#xff0c;使得开发者只需要定义服务接口&#xff0c;而无需关心底层的HTTP请求和序列…

1688商品详情关键词数据-API

要利用 Python 爬虫采集 1688 商品详情数据&#xff0c;需要先了解 1688 网站的页面结构和数据请求方式。一般使用 requests 库请求网站的数据&#xff0c;使用 BeautifulSoup 库解析网页中的数据。 以下是一个简单的 Python 爬虫采集 1688 商品详情数据的示例代码&#xff1a…

YOLO11改进|注意力机制篇|引入上下文锚注意力机制CAA

目录 一、【CAA】注意力机制1.1【CAA】注意力介绍1.2【CAA】核心代码 二、添加【CAA】注意力机制2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【CAA】注意力机制 1.1【CAA】注意力介绍 CAA注意力机制的结构图如下&#xff0c;下面根据…

RAG:检索增强生成技术概览

Why 将大模型应用于实际业务场景时会发现&#xff0c;通用的基础大模型基本无法满足我们的实际业务需求&#xff0c;主要有以下几方面原因&#xff1a; 知识的局限性&#xff1a;大模型对于一些实时性的、非公开的或离线的数据是无法获取到的。幻觉问题&#xff1a;所有的AI模…

828华为云征文 | 利用FIO工具测试Flexus云服务器X实例存储性能

目录 一、Flexus云服务器X实例概要 1.1 Flexus云服务器X实例摘要 1.2 产品特点 1.3 存储方面性能 1.4 测评服务器规格 二、FIO工具 2.1 安装部署FIO 2.2 主要性能指标概要 三、进行压测 3.1 测试全盘随机读IO延迟 3.2 测试全盘随机写IO延迟 3.3 测试随机读IOPS 3.4…

KEYENCE Programming Contest 2024(AtCoder Beginner Contest 374) 题解

A - Takahashi san 2 Problem Statement KEYENCE has a culture of addressing everyone with the suffix “-san,” regardless of roles, age, or positions. You are given a string S consisting of lowercase English letters. If S ends with san, print Yes; otherwi…

R包:ggheatmap热图

加载R包 # devtools::install_github("XiaoLuo-boy/ggheatmap")library(ggheatmap) library(tidyr)数据 set.seed(123) df <- matrix(runif(225,0,10),ncol 15) colnames(df) <- paste("sample",1:15,sep "") rownames(df) <- sapp…