(双指针) 有效三角形的个数 和为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;}
};


总结

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

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

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

相关文章

笔记1--Llama 3 超级课堂 | Llama3概述与演进历程

1、Llama 3概述 https://github.com/SmartFlowAI/Llama3-Tutorial.git 【Llama 3 五一超级课堂 | Llama3概述与演进历程】 2、Llama 3 改进点 【最新【大模型微调】大模型llama3技术全面解析 大模型应用部署 据说llama3不满足scaling law&#xff1f;】…

【C++】深入剖析C++11中右值引用和左值引用

目录 一、左值引用 && 右值引用 二、左值引用于右值引用的比较 三、 右值引用使用场景和意义 1、函数返回值 ①移动赋值 ②移动构造 2、STL容器插入接口 ​3、完美转发 一、左值引用 && 右值引用 传统的C语法中就有引用的语法&#xff0c;而C11中新增了…

pygame鼠标绘制

pygame鼠标绘制 Pygame鼠标绘制效果代码 Pygame Pygame是一个开源的Python库&#xff0c;专为电子游戏开发而设计。它建立在SDL&#xff08;Simple DirectMedia Layer&#xff09;的基础上&#xff0c;允许开发者使用Python这种高级语言来实时开发电子游戏&#xff0c;而无需被…

淘宝霸屏必备!了解淘宝商品评论电商API接口

淘宝商品评论电商API接口是指用于获取淘宝商品评论信息的一种接口&#xff0c;通过该接口可以获取淘宝网上商品的评价内容、评价等级、评价数量等信息。通过了解并使用该接口&#xff0c;联讯数据能够帮助电商了解消费者对商品的评价情况&#xff0c;做好商品的推广和销售工作。…

力扣刷题:四数相加Ⅱ

题目详情&#xff1a; 解法一&#xff1a;暴力枚举 对于这道题&#xff0c;我们的第一思路就是暴力枚举&#xff0c;我们可以写一个四层的for循环进行暴力匹配&#xff0c;只要相加的结果等于0就进行统计。但是我们会发现&#xff0c;我们的事件复杂度为O(N^4)事件复杂度非常大…

【Word】写论文,参考文献涉及的上标、尾注、脚注 怎么用

一、功能位置 二、脚注和尾注区别 1.首先脚注是一个汉语词汇&#xff0c;论文脚注就是附在论文页面的最底端&#xff0c;对某些内容加以说明&#xff0c;印在书页下端的注文。脚注和尾注是对文本的补充说明。 2.其次脚注一般位于页面的底部&#xff0c;可以作为文档某处内容的…

机器人系统ros2内部接口介绍

内部 ROS 接口是公共 C API &#xff0c;供创建客户端库或添加新的底层中间件的开发人员使用&#xff0c;但不适合典型 ROS 用户使用。 ROS客户端库提供大多数 ROS 用户熟悉的面向用户的API&#xff0c;并且可能采用多种编程语言。 内部API架构概述 内部接口主要有两个&#x…

tcping的安装,ping和tcping的区别

ping和tcping的区别 功能不同&#xff1a; Ping&#xff1a;Ping是一种基于ICMP协议的网络工具&#xff0c;用于测试主机之间的连通性。它发送ICMP回显请求&#xff08;Echo Request&#xff09;到目标主机&#xff0c;并等待目标主机返回ICMP回显应答&#xff08;Echo Reply…

架构师:搭建Spring Security、OAuth2和JWT 的安全认证框架

1、简述 Spring Security 是 Spring 生态系统中的一个强大的安全框架,用于实现身份验证和授权。结合 OAuth2 和 JWT 技术,可以构建一个安全可靠的认证体系,本文将介绍如何在 Spring Boot 中配置并使用这三种技术实现安全认证,并分析它们的优点。 2、Spring Security Spri…

Java 笔记 13:Java 数组内容,数组的声明、创建、初始化、赋值等,以及内存分析

一、前言 记录时间 [2024-05-03] 系列文章简摘&#xff1a; Java 笔记 01&#xff1a;Java 概述&#xff0c;MarkDown 常用语法整理 Java 笔记 02&#xff1a;Java 开发环境的搭建&#xff0c;IDEA / Notepad / JDK 安装及环境配置&#xff0c;编写第一个 Java 程序 Java 笔记 …

会声会影电影片头怎么做 会声会影电影质感调色技巧 会声会影视频制作教程 会声会影下载免费中文版

片头通常通过一系列的图像、音乐和文字等元素来引入电影的主题和氛围。通过视觉和音频的呈现方式&#xff0c;给观众留下深刻的第一印象&#xff0c;为电影的故事铺设基础。这篇文章来学习一下会声会影电影片头怎么做&#xff0c;会声会影电影质感调色技巧。 一、会声会影电影…

ASP.NET视频点播系统的设计与实现

摘 要 本文阐述了基于WEB的交互式视频点播系统的协议原理、软件结构和设计实现。本视频点播系统根据流媒体传输原理&#xff0c;在校园局域网的基础上模拟基于Web的视频点播系统&#xff0c;实现用户信息管理、视频文件的添加、删除、修改及在线播放和搜索功能。本系统是一个…

XMall-Front:基于Vue.js的XMall商城前台页面的开发实践

XMall-Front&#xff1a;基于Vue.js的XMall商城前台页面的开发实践 摘要 随着电子商务的蓬勃发展&#xff0c;用户体验逐渐成为决定电商平台成功与否的关键因素。作为XMall商城项目的一部分&#xff0c;XMall-Front是基于Vue.js的前端页面开发&#xff0c;其目标是为用户提供…

关于地盘的紧固连接技术——SunTorque智能扭矩系统

底盘作为汽车的重要组成部分&#xff0c;其材料的选择和连接技术也日益受到关注。尤其是随着新能源汽车的兴起&#xff0c;底盘轻量化已成为一种趋势。在这一背景下&#xff0c;底盘新材料与紧固连接技术的研究和应用显得尤为重要。今天SunTorque智能扭矩系统和大家一起了解地盘…

Go通过CRUD实现学生管理系统

虽然这个项目没有什么含金量&#xff0c;但是可以熟悉go的语法和go开发项目的一般流程 项目结构 项目实现了五个功能&#xff1a; &#xff08;1)增加一个学生 &#xff08;2&#xff09;删除一个学生 &#xff08;3&#xff09;修改一个学生的信息 &#xff08;4&#xf…

9.4k Star!MemGPT:伯克利大学最新开源、将LLM作为操作系统、无限上下文记忆、服务化部署自定义Agent

9.4k Star&#xff01;MemGPT&#xff1a;伯克利大学最新开源、将LLM作为操作系统、无限上下文记忆、服务化部署自定义Agent 原创 Aitrainee | 公众号&#xff1a;AI进修生&#xff1a;AI算法工程师 / Prompt工程师 / ROS机器人开发者 | 分享AI动态与算法应用资讯&#xff0c;提…

N7552A是德科技N7552A电子校准件

181/2461/8938产品概述&#xff1a; 更小巧轻便的 2 端口模块&#xff0c;支持 3.5 mm 或 N 型 50 Ω 连接器&#xff0c;能够将校准时间缩短一半 特点 频率范围&#xff1a;直流至 9 GHz 使用 N 型或 3.5 mm 连接器 更小巧轻便的 2 端口电子校准件&#xff08;ECal&#xff…

力扣刷题--数组--第一天

一、数组 数组特点&#xff1a; 连续内存空间存储得数据元素类型一致数组可以通过下标索引查找数据元素&#xff0c;可以删除、替换、添加元素等 1.1 二分查找 使用二分查找需满足得条件&#xff1a; 数组是有序的&#xff1b;数组中没有重复元素&#xff1b;查找的target…

[Docker]容器的网络类型以及云计算

目录 知识梗概 1、常用命令2 2、容器的网络类型 3、云计算 4、云计算服务的几种主要模式 知识梗概 1、常用命令2 上一篇已经学了一些常用的命令&#xff0c;这里补充两个&#xff1a; 导出镜像文件&#xff1a;[rootdocker ~]# docker save -o nginx.tar nginx:laster 导…

关于Oracle 23ai 你要知道的几件事情

1.版本生命周期 23ai发布后的Oracle版本生命周期图&#xff0c;可以看到23ai是长期支持版本可以到2032年。 引申 Oracle版本分为两类 Innovation Release--创新版本&#xff0c;一般提供至少两年技术支持 Long Term Release --长期支持版本&#xff0c;一般提供5年premier和…