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

(双指针) 有效三角形的个数 和为s的两个数字 三数之和 四数之和

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

文章目录

前言

一、有效三角形的个数(medium)

1.1、题目

1.2、讲解算法原理

1.3、编写代码

二、和为s的两个数字

2.1、题目

2.2、讲解算法原理

2.3、编写代码

三、三数之和

3.1、题目

3.2、讲解算法原理

3.3、编写代码

四、四数之和

4.1、题目

4.2、讲解算法原理

4.3、编写代码

总结



前言

世上有两种耀眼的光芒,一种是正在升起的太阳,一种是正在努力学习编程的你!一个爱学编程的人。各位看官,我衷心的希望这篇博客能对你们有所帮助,同时也希望各位看官能对我的文章给与点评,希望我们能够携手共同促进进步,在编程的道路上越走越远!


提示:以下是本篇文章正文内容,下面案例可供参考

一、有效三角形的个数(medium)

1.1、题目

1.2、讲解算法原理

补充数学知识:给我们三个数,判断是都能够构成三角形。

步骤:利用单调性,使用双指针算法来解决问题。

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

来举例一个区间[2,2,3,4,4,9,10]来说明一下情况:

  • 优化:先对整个数组排序,用于固定最大的数。
  • 我们根据三角形的满足条件得出的两个结论:因为数组是升序的,所以设a和b为最小的两边,c为最大的边,a + b > c就能构成三角形;a + b <= c便不能构成三角形。
  • 我们使用双指针的思想,假设数组的下标为指针,设left指针指向数组下标为0的位置,设right指针指向数组中最大的数的左区间中的最大值。
  1. 拿上面的数组为例,先固定最大的数为10,设left为第一个2所在的位置,right为9所在的位置,left + right大于10,因为是升序,所以当right不变,left指向2~9之间的任意数时,都符合三角形的条件,因此得出的结论:下标right - left的值为满足三角形的情况,9所在的位置可以划掉,right--。
  2. 此时left为第一个2,right为5,最大值依旧为10:2 + 5 < 10,不构成三角形的条件,left++,再次判断三角形的条件,重复操作,直到left和right相遇,最大值为10所在的情况查看完毕,更新最大值。

1.3、编写代码

class Solution 
{
public:int triangleNumber(vector<int>& nums) {// 先进行排序sort(nums.begin(), nums.end());// 利用双指针解决问题int ret = 0, n = nums.size();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;}
};

二、和为s的两个数字

2.1、题目

2.2、讲解算法原理

利用单调性,使用双指针算法解决问题。

举一个数组[2,7,11,15,19,21],t = 30为例:设left指针指向2,right指针指向21,让两数相加来和t值(30)比较。

分为三种情况:

  1. sum < t:left为2,right为21,相加得23 < t(30),因为数组为递增顺序,left和right区间的数字都比21要小,因此划掉2,left++;
  2. sum > t:left为11,right为21,相加得32 > t(30),left和right区间的数值都比left(11)要大,因此划掉21,right--;
  3. sum = t(30):返回结果。

2.3、编写代码

class Solution 
{
public:vector<int> twoSum(vector<int>& price, int target) {int left = 0,right = price.size() - 1;while(left < right){if(price[left] + price[right] > target){right--;}else if(price[left] + price[right] < target){left++;}else{return {price[left],price[right]};}}// 照顾编译器return {-1,-1};}
};

三、三数之和

3.1、题目

3.2、讲解算法原理

步骤:

  1. 排序;
  2. 固定一个数a;(小优化:对于下面的数组来说,a > 0之后,不管left 和 right 两个指针指向哪里,和 a 相加之后,都不会等于0,因此 a > 0之后,就可以结束了)
  3. 在该固定的数a后面的区间内,利用“双指针算法”快速找到两个的和等于 -a 即可。

处理细节问题:

1、去重;

  • 找到一种结果之后,left 和 right 指针要跳过重复元素;
  • 当使用完一次双指针算法之后,i 也需要跳过重复的元素;
  • 避免越界。

2、不漏;

  • 找到一种结果之后,不要“停”,缩小区间,继续寻找。

3.3、编写代码

class Solution 
{
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> ret;// 定义一个二级数组用于储存数组// 排序sort(nums.begin(), nums.end());int i = 0, n = nums.size();// 固定一个数afor(i = 0; i < n; ) // for()循环中初始化、判断和调整这三个部分都可以写为空{// 小优化if(nums[i] > 0) break;int left = i + 1, right = n - 1, target = -nums[i];// target两个指针所指向的数相加==固定数的负数while(left < right){int sum = nums[left] + nums[right];if(sum > target) right--;else if(sum < target) left++;else {ret.push_back({nums[i], nums[left], nums[right]});left++, right--;// 去重操作 left rightwhile(left < right && nums[left] == nums[left - 1]) left++;while(left < right && nums[right] == nums[right + 1]) right--;}}i++;// 去重操作 iwhile(i < n && nums[i] == nums[i - 1]) i++;}return ret;}
};

四、四数之和

4.1、题目

4.2、讲解算法原理

排序 + 双指针:

  1. 依次固定一个数a;
  2. 在 a 后面的区间内,利用"三数之和"找到三个数,使这三个数的和等于 target -a 即可。

三数之和:

  1. 依次固定一个数 b;
  2. 在 b 后面的区间内,利用"双指针"找到两个数,使这两个数的和等于 target - a - b 即可。

处理细节问题:

1、去重;

  • 找到一种结果之后,left 和 right 指针要跳过重复元素;
  • 当使用完一次双指针算法之后,i 也需要跳过重复的元素;
  • 避免越界。

2、不漏;

  • 找到一种结果之后,不要“停”,缩小区间,继续寻找。

4.3、编写代码

class Solution 
{
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {// 定义一个二级数组,用来存放数组vector<vector<int>> ret;// 排序sort(nums.begin(),nums.end());// 固定一个数aint i = 0,n = nums.size();for(i = 0; i < n; ){// 固定数b ---> 将四数求和转换成三数求和for(int j = i + 1; j < n; ){// 利用双指针的算法int left = j + 1, right = n -1; while(left < right){// 这个地方用int类型,有可能会超出int的范围,用long longlong long aim = (long long)target - nums[i] - nums[j];int sum = nums[left] + nums[right];if(sum > aim) right--;else if(sum < aim) left++;else{ret.push_back({nums[i], nums[j], nums[left], nums[right]});left++, right--;// 去重操作 left rightwhile(left < right && nums[left] == nums[left-1]) left++;while(left < right && nums[right] == nums[right+1]) right--;}}j++;// 去重操作 jwhile(j < n && nums[j] == nums[j-1]) j++;}i++;// 去重操作 iwhile(i < n && nums[i] == nums[i-1]) i++;}return ret;}
};


总结

好了,本篇博客到这里就结束了,如果有更好的观点,请及时留言,我会认真观看并学习。
不积硅步,无以至千里;不积小流,无以成江海。

相关文章:

(双指针) 有效三角形的个数 和为s的两个数字 三数之和 四数之和

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 文章目录 前言 一、有效三角形的个数&#xff08;medium&#xff09; 1.1、题目 1.2、讲解算法原理 1.3、编写代码 二、和为s的两个数字 2.1、题目 2.2、讲解算…...

力扣每日一题114:二叉树展开为链表

题目 中等 提示 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同…...

Linux系统下使用LVM扩展逻辑卷的步骤指南

Linux系统下使用LVM扩展逻辑卷的步骤指南 文章目录 Linux系统下使用LVM扩展逻辑卷的步骤指南前言一、逻辑卷管理&#xff08;LVM&#xff09;简介二、扩展逻辑卷步骤1. 检查当前的磁盘布局2. 创建新的分区3. 更新内核的分区表4. 初始化新的物理卷5. 将物理卷添加到卷组6. 调整逻…...

探索AI编程新纪元:从零开始的智能编程之旅

提示&#xff1a;Baidu Comate 智能编码助手是基于文心大模型&#xff0c;打造的新一代编码辅助工具 文章目录 前言AI编程概述&#xff1a;未来已来场景需求&#xff1a;从简单到复杂&#xff0c;无所不包体验步骤&#xff1a;我的AI编程初探试用感受&#xff1a;双刃剑下的深思…...

RustGUI学习(iced)之小部件(三):如何使用下拉列表pick_list?

前言 本专栏是学习Rust的GUI库iced的合集,将介绍iced涉及的各个小部件分别介绍,最后会汇总为一个总的程序。 iced是RustGUI中比较强大的一个,目前处于发展中(即版本可能会改变),本专栏基于版本0.12.1. 概述 这是本专栏的第三篇,主要讲述下拉列表pick_list部件的使用,会…...

【OceanBase诊断调优】—— Unit 迁移问题的排查方法

适用版本&#xff1a;V2.1.x、V2.2.x、V3.1.x、V3.2.x 本文主要介绍 OceanBase 数据集在副本迁移过程中遇到的问题的排查方法。 适用版本 V2.1.x、V2.2.x、V3.1.x、V3.2.x 手动调度迁移问题的排查 OceanBase 数据库的 RootService 模块负责 Unit 迁移的调度&#xff0c;如果…...

[极客大挑战 2019]PHP

1.通过目录扫描找到它的备份文件&#xff0c;这里的备份文件是它的源码。 2.源码当中涉及到的关键点就是魔术函数以及序列化与反序列化。 我们提交的select参数会被进行反序列化&#xff0c;我们要构造符合输出flag条件的序列化数据。 但是&#xff0c;这里要注意的就是我们提…...

数据结构之跳跃表

跳跃表 跳跃表&#xff08;skiplist&#xff09;是一种随机化的数据&#xff0c; 由 William Pugh 在论文《Skip lists: a probabilistic alternative to balanced trees》中提出&#xff0c; 跳跃表以有序的方式在层次化的链表中保存元素&#xff0c; 效率和平衡树媲美 —— …...

搜维尔科技:动作捕捉解决方案:销售、服务、培训和支持

动作捕捉解决方案&#xff1a;销售、服务、培训和支持 搜维尔科技&#xff1a;动作捕捉解决方案&#xff1a;销售、服务、培训和支持l...

数据库管理-第184期 23ai:干掉MongoDB的不一定是另一个JSON数据库(20240507)

数据库管理184期 2024-05-07 数据库管理-第184期 23ai:干掉MongoDB的不一定是另一个JSON数据库&#xff08;20240507&#xff09;1 JSON需求2 关系型表设计3 JSON关系型二元性视图3 查询视图总结 数据库管理-第184期 23ai:干掉MongoDB的不一定是另一个JSON数据库&#xff08;20…...

刷代码随想录有感(58):二叉树的最近公共祖先

题干&#xff1a; 代码&#xff1a; class Solution { public:TreeNode* traversal(TreeNode* root, TreeNode* p, TreeNode* q){if(root NULL)return NULL;if(root p || root q)return root;TreeNode* left traversal(root->left, p, q);TreeNode* right traversal(r…...

[开发|安卓] Android Studio 开发环境配置

Android Studio下载 Android Studio下载地址 下载SDK依赖 1.点击左上角菜单 2.选择工具 3.打开SDK管理中心 4.下载项目目标Android版本的SDK 配置安卓虚拟机 1.打开右上角的设备管理 2.选择合适的手机规格 3.下载并选择项目目标Android系统 4.点击完成配置 …...

开发 Chrome 浏览器插件入门

目录 前言 一&#xff0c;创建插件 1.创建一个新的目录 2.编写清单文件 二&#xff0c;高级清单文件 1.编写放置右窗口 2.常驻的后台JS或后台页面 3.event-pages 短周期使用 三&#xff0c;Chrome 扩展 API 函数 1.浏览器操作函数 2.内容脚本函数 3.后台脚本函数 4…...

在数字化转型的浪潮中,CBDB百数服务商如何破浪前行?

在信息化时代&#xff0c;传统咨询企业面临着数字化转型的挑战与机遇。如何利用数字化技术提升业务效率、增强客户黏性&#xff0c;成为了行业关注的焦点。云南析比迪彼企业管理有限公司&#xff08;CBDB&#xff09;作为云南地区的企业咨询服务提供商&#xff0c;率先与百数展…...

程序员的实用神器

在软件开发的海洋中&#xff0c;程序员的实用神器如同航海中的指南针&#xff0c;帮助他们导航、加速开发、优化代码质量&#xff0c;并最终抵达成功的彼岸。这些工具覆盖了从代码编写、版本控制到测试和部署的各个环节。然而&#xff0c;程序员们通常会有一套自己喜欢的工具集…...

spss 导入数据的时候 用于确定数据类型的值所在的百分比95%是什么意思,数据分析,医学数据分析

在SPSS中&#xff0c;当提及“数据类型的值所在的百分比95%”时&#xff0c;这通常与数据的统计分布或置信区间有关&#xff0c;而不是直接关于数据类型的定义。 导入数据的时候需要定义数据类型&#xff0c;那么根据提供的数据&#xff0c;来定义&#xff0c;有时候&#xff…...

Python进阶之-上下文管理器

✨前言&#xff1a; &#x1f31f;什么是上下文管理器&#xff1f; 在Python中&#xff0c;上下文管理器是支持with语句的对象&#xff0c;用于为代码块提供设置及清理代码。上下文管理器广泛应用于资源管理场景&#xff0c;例如文件操作、网络连接、数据库会话等&#xff0c…...

什么年代了,还在拿考勤说事

最近&#xff0c;看到了某公司的一项考勤规定&#xff1a;自然月内&#xff0c;事假累计超过3次或者累计请假时间超过8小时的&#xff0c;不予审批&#xff0c;强制休假的按旷工处理。 真的想吐槽&#xff0c;什么年代了&#xff0c;还在拿考勤说事&#xff0c;这是什么公司、什…...

泰迪智能科技中职大数据实验室建设(职业院校大数据实验室建设指南)

职校大数据实验室是职校校园文化建设的重要部分&#xff0c;大数据实训室的建设方案应涵盖多个方面&#xff0c;包括硬件设施的配备、软件环境的搭建、课程资源的开发、师资力量的培养以及实践教学体系的完善等。 打造特色&#xff0c;对接生产 社会经济与产业的…...

Qt QThreadPool线程池

1.简介 QThreadPool类管理一个QThread集合。 QThreadPool管理和重新设计单个QThread对象&#xff0c;以帮助降低使用线程的程序中的线程创建成本。每个Qt应用程序都有一个全局QThreadPool对象&#xff0c;可以通过调用globalInstance来访问该对象。 要使用其中一个QThreadPool…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...