【刷题】双指针进阶

在这里插入图片描述
请看入门篇 :双指针入门
送给我们一句话:
如今我努力奔跑,不过是为了追上那个曾经被寄予厚望的自己 —— 约翰。利文斯顿

双指针进阶

  • Leetcode 611 有效三角形的个数
  • Leetcode LCR179.查找总价格为目标值的两个商品
  • Leetcode 15.三数之和
  • Thanks♪(・ω・)ノ谢谢阅读!!!
  • 下一篇文章见!!!

今天我继续学习了双指针的题目,继续探索了双指针的进阶用法。其中包括对撞指针,单调性分析指针。接下来我带大家一起复盘一下我做的三道题目,来深入了解一下双指针算法的进阶版本。在入门篇中我们基本知道了双指针的思路,即控制两个指向分别按条件转换,这样配合排序算法可以大大降低算法的时间复杂度。
而接下来我们继续学习,来看看双指针对复杂问题的解决。

Leetcode 611 有效三角形的个数

在这里插入图片描述
来看看给出的测试用例:

  1. 输入: nums = [2,2,3,4]
  2. 输出: 3
  3. 解释:有效的组合是:
    1. 2,3,4 (使用第一个 2)
    2. 2,3,4 (使用第二个 2)
    3. 2,2,3

根据题目和样例,这是一个看起来十分简单的题目,让小学生来解决也有可能,毕竟大家都会使用最直接了当的暴力解法,遍历整个数组,筛选出满足的三角形即可。下面我们使用伪代码来简单写一下思路:

for(int i = 0;i < n - 2; i++){for(int j = i + 1 ; j < n - 1; j++){for(int k = j + 1 ;k < n;k++){check(num[i],num[j],num[k]);}}
}

很显然,这样的算法时间复杂度是O( n^ 3),非常非常非常不理想。
那如何把双指针使用到里面呢?
首先我们来看check的过程:
思路与算法

对于正整数 a,b,c它们可以作为三角形的三条边,当且仅当:

a+b>c
a+c>b
b+c>a

均成立。如果我们将三条边进行升序排序,使它们满足 a≤b≤c,那么 a+c>b 和b+c>a 使一定成立的,我们只需要保证 a+b>c。所以我们只需要比较较小的两个数和最大是否满足即可。

所以现在我们有了一个初步的想法:

  1. 先对容器元素进行排序
  2. 从最大值开始依次作为最大值 num1 来找三角形
  3. 这时开始使用双指针的思想,分别取0(left)下标位置的 num2 和 num1 左边第一个(right)元素 num3,进行比较
  4. 使用单调性判断:
    1. 如果 num2 + num3 > num1 三角形成立,则left 到 right之间的元素都满足 (根据单调性判 断)
    2. 如果 num2 + num3 <= num1那么三角形不成立,那么就要右移 left 来使 num2 + num3更大一些,
  5. 依次往复,就解决问题了。

来看代码:

//比较函数
int compare(int i,int j){return i < j;
} 
class Solution {
public:int triangleNumber(vector<int>& nums) {//首先排序,优化容器//取一个固定的较大数//在左区间进行查找,利用单调性sort(nums.begin(),nums.end(),compare);int count = 0;  int  m = nums.size() - 1;while(m >= 2){int max = nums[m];int left = 0,right = m - 1;while(left <= right){//左值是0直接跳过//右值是零直接跳出循环(有0不可能成立)if(nums[right] == 0) break;while (nums[left] == 0) left++; int sum = nums[left] + nums[right];if(sum > max) {count += right - left;right--;} else left++;}//每次m 需要进行移动。m--;}return count;}
};

这样我们就成功解决了问题。来看运行的效果:
在这里插入图片描述
击败 93.48%,我们非常快速!!!(如果使用暴力算法,就直接超时了)
所以双指针的算法是非常高效的算法,并且一般有序问题都可以进行求解!

Leetcode LCR179.查找总价格为目标值的两个商品

在这里插入图片描述

这道题是十分经典的题目,来自剑指offer 的和为 s 的两个数,让我们来看看吧
根据题目描述,也是比较简单的问题,我们一样来进行单调性分析:

  1. 首先也是进行排序
  2. 使用两个指向 left num1 和 right num2 分别从左右开始
  3. 来分析结果:
    1. num1 + num2 == target 直接返回即可
    2. num1 + num2 > target 说明较大,那么right左移即可
    3. num1 + num2 < target 说明较小,那么left右移即可
  4. 直到找到结果就好

来看代码:


class Solution {
public:vector<int> twoSum(vector<int>& price, int target) {//分别从左右开始遍历int left = 0;int right = price.size()-1;while(left < right){int sum = price[left] + price[right];//三种结果分析好if(sum > target) right--;else if(sum < target) left++;//返回vector类型 ,使用 { } 包括即可else return{price[left] , price[right]};}//照顾编译器,不然报错return {-1,-1};}
};

我们这样也成功通过测试用例,完成题目!!!
思路非常直接了当。

Leetcode 15.三数之和

在这里插入图片描述

我们先来看给出的样例:

  1. 输入:nums = [-1,0,1,2,-1,-4]
  2. 输出:[[-1,-1,2],[-1,0,1]]
  3. 解释:
    nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
    nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
    nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
    不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
    注意,输出的顺序和三元组的顺序并不重要。

根据我们的最直接的想法就是遍历,但是我们都知道这样十分复杂,哈哈哈哈
我们来看这道题和判断三角形是不是很像,三角形是要求num1 + num2 > num3,
而这题要求我们num1 + num2 == num3,所以基础的双指针框架是十分相似的,我们可以先写出一个框架来:

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {//先使数据有序sort(nums.begin(),nums.end());vector<vector<int>> ans;//开始遍历,取最大数int m = nums.size() - 1;//从 最大值 开始while(m >= 2){int left = 0 , right = m - 1;int num1 = nums[m];//双指针进行while(left < right){//左值右值进行初始化int num2 = nums[left] , num3 = nums[right];//进行判断if(num2 + num3 + num1 == 0){//满足就进行插入ans.push_back({num2,num3,num1}) ;left++;right--;} else if(num2 + num3 + num1 < 0) {left++;}else if(num2 + num3 + num1 > 0) {right--;}}//m 向左移动m--;}return ans;}
};

这样提交后:我们只看这一个样例:在这里插入图片描述

发现有好多重复的,这应该怎麽办??????
我的想法是从根源出发,既然我们排好序了就直接每次选中一组后,把相应元素都跳过!!!
不满足的也一次性全部都跳过!!!直接了当

这样一定一定不会有重复的出现!!!

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {//先使数据有序sort(nums.begin(),nums.end());vector<vector<int>> ans;//从最大值开始遍历int m = nums.size() - 1;while(m >= 2){//左右值进行初始化int left = 0 , right = m - 1;int num1 = nums[m];while(left < right){int num2 = nums[left] , num3 = nums[right];if(num2 + num3 + num1 == 0){ans.push_back({num2,num3,num1}) ;//满足条件直接全部都跳过!!!while(nums[left] == num2 && left < right){left++;}while(nums[right] == num3 && left < right){right--;}} else if(num2 + num3 + num1 < 0) {//不满足条件的都跳过!!!while(nums[left] == num2 && left < right){left++;}}else if(num2 + num3 + num1 > 0) {//不满足条件的都跳过!!!while(nums[right] == num3 && left < right){right--;}}}//满足的 m 也都跳过!!!while(nums[m] == num1 && m > 0){m--;}}return ans;}
};

这样我们完成里去除重复的元素!!!!!!
把最复杂的问题简化到了每个步骤里面:
来看效果:
在这里插入图片描述
还不错!!!

送给大家一句话:
如今我努力奔跑,不过是为了追上那个曾经被寄予厚望的自己 —— 约翰。利文斯顿

Thanks♪(・ω・)ノ谢谢阅读!!!

下一篇文章见!!!

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

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

相关文章

手把手教你使用Python第三方模块

1.第三方模块 一般是别人解决特定问题的功能进行了封装&#xff0c;可以通过安装直接使用 注意 第三方模块需要先安装&#xff0c;才能使用 常见的安装方式&#xff1a;通过pip工具或者通过pycharm编辑器进行安装 2.pip指令安装 pip -V # 查看pip的版本 pip 23.2.1 fr…

基于PHP的数字化档案管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的数字化档案管理系统 一 介绍 此数字化档案管理系统基于原生PHP&#xff0c;MVC架构开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 php(mvc)mysqlbootstrapphpstudyvscode 二 功能 …

网络原理(网络协议初识)

目录 1.网络通信基础 1.1IP地址 1.2端口号 1.3认识协议 1.4五元组 1.5 协议分层 2.TCP/IP五层&#xff08;或四层&#xff09;模型 2.1网络设备所在分层 2.2网络分层对应 3.封装和分用 1.网络通信基础 网络互连的目的是进行网络通信&#xff0c;也即是网络数据传输&#…

手写简易操作系统(九)--实现打印函数

前情提要 前面我们已经进入内核程序了&#xff0c;中间穿插了一点特权级的知识&#xff0c;现在我们开始准备一个打印函数 很不幸&#xff0c;还有汇编程序 一、C调用规约 因为涉及到C与汇编的联合编程&#xff0c;我们这里简述一下调用规约&#xff0c;调用规约就是约定参…

Node.js 学习笔记 fs、path、http模块;模块化;包;npm

Node.js学习 Node.js一、定义1.前端工程化2.Node.js 为何能执行 JS&#xff1f;3.安装nodejs、删除之前的nodejs4.使用 Node.js 二、fs模块 \- 读写文件三、path 模块案例 - 压缩前端html四、HTTP相关URL中的端口号常见的服务程序http 模块-创建 Web 服务案例&#xff1a;浏览时…

Python二级备考

考试大纲如下&#xff1a; 基本要求 考试内容 考试方式 比较希望能直接刷题&#xff0c;因为不懂的比较多可能会看视频。 基础操作刷题&#xff1a; 知乎大头计算机1-13题 import jieba txtinput() lsjieba.lcut(txt) print("{:.1f}".format(len(txt)/len(ls)…

XIAO ESP32S3部署Edge Impulse模型

在上一篇文章中我们介绍了如何使用edge impulse训练一个图片分类模型并导出arduino库文件。在这篇文章中我们将介绍如何在esp32s3中部署这个训练好的图片分类模型。 添加进Arduino库 有两种方法将下载的文件添加进Arduino库。 在Arduino IDE程序中&#xff0c;转到项目选项卡…

✅技术社区—集成xxl-job实现定时任务的管理和执行

xxl-job是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线&#xff0c;开箱即用。(其中XXL是作者许雪里的简称) xxl-job是对老牌调度平台Quartz进行的封装。在开始介绍xxl-job之前我来先简单…

Jmeter —— jmeter中元件的执行顺序作用域

元件的执行顺序&#xff1a; 配置元件-->前置处理程序-->定时器-->取样器-->后置处理程序&#xff08;除非Sampler 得 到的返回结果为空&#xff09;-->断言&#xff08;除非Sampler 得到的返回结果为空&#xff09;-->监听器 &#xff08;除非Sampler 得到…

【Redis系列】深入了解 Redis:一种高性能的内存数据库

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

微信小程序-day01

文章目录 前言微信小程序介绍 一、为什么要学习微信小程序?二、微信小程序的历史创建开发环境1.注册账号2.获取APPID 三、下载微信开发者工具1.创建微信小程序项目2.填写相关信息3.项目创建成功 四、小程序目录结构项目的主体组成结构 总结 前言 微信小程序介绍 微信小程序&…

新 树莓派4B 温湿度监测 基于debian12的树莓派OS

前言 本文旨在完成通过外接温湿度传感器至树莓派使得树莓派不断记录并存储温湿度数据 这个领域有很多文章&#xff0c;但是部分文章已经缺乏了时效性&#xff0c;在最新系统不适用&#xff0c;本文目前适用 硬件 硬件连接 温湿度传感器常选用DHT11和DHT22&#xff0c;淘宝…

HelpLook AI 升级!一键生成SEO设置关键要素

| 现代SEO营销为何选择与AI同行 众多企业面临SEO优化日趋复杂的挑战&#xff0c;投入的时间和资源不断攀升。然而&#xff0c;HelpLook利用AI技术&#xff0c;一键完成SEO关键词和描述的生成&#xff0c;无需额外付费或繁琐操作&#xff0c;轻松提升网站曝光和点击率&#xff…

Android 学习之追踪应用的安装情况

先上结论&#xff0c;急用的话直接看结论 结论一、借助 API 读取安装信息&#xff0c;然后上报二、借助手动埋点&#xff0c;然后上报三、对比 前提过程 结论 一、借助 API 读取安装信息&#xff0c;然后上报 通过 PackageManager 的 API&#xff0c;我们可以得知自身应用安装…

【SSM】任务列表案例 基本CRUD SSM整合

文章目录 一、案例功能预览二、接口分析三、前端工程导入四、后端程序实现和测试4.1 准备4.2 功能实现4.2.1 分页查询显示4.2.2 添加计划4.2.2 删除计划4.2.3 修改计划 4.3 前后联调 一、案例功能预览 Github 地址 &#xff1a; ssm-integration-part 二、接口分析 学习计划…

【话题】2024年AI辅助研发趋势,有那些应用领域

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读文章&#xff01; 此篇是【话题达人】系列文章&#xff0c;这一次的话题是《2024年AI辅助研发趋势》 目录 背景概念实践医药领域汽车设计领域展望未来文章推荐 背景 随着人工智能技术的持续发展与突破&#xff0c;2024年AI辅…

BI数据分析案例详解:零售人货场分析该怎么做?

在当今快节奏、高竞争的商业环境中&#xff0c;人货场分析已成为企业成功的关键因素之一。科技的进步和数据的日益丰富使得企业对人流、货物流和场地布局的深入洞察变得愈发重要。通过科学的人货场分析&#xff0c;企业能更好地理解顾客行为、优化供应链、提高运营效率&#xf…

【wine】WINEDEBUG 分析mame模拟器不能加载roms下面的游戏 可以调整参数,快速启动其中一个游戏kof98

故障现象&#xff0c;MAME启动后&#xff0c;游戏都没有识别 添加日志输出&#xff0c;重新启动wine #!/bin/bashexport WINEPREFIX$(pwd)/.wine export WINESERVER$(pwd)/bin/wineserver export WINELOADER$(pwd)/bin/wine export WINEDEBUG"file,mame,warn,err"…

加速渲染:Blender与在线渲染农场的结合

​在数字艺术和三维设计的世界里&#xff0c;Blender软件因其强大的功能和灵活性而广受欢迎。然而&#xff0c;随着项目复杂性的增加&#xff0c;渲染时间也随之增长&#xff0c;成为艺术家和设计师面临的一大挑战。在线渲染农场的出现&#xff0c;为这一问题提供了革命性的解决…

C语言例:(m=a==b)||(n=a==b);求解m,n的值

题目&#xff1a;设int a0,b0,m0,n0;执行语句(mab)||(nab);求解m,n的值。 #include<stdio.h> int main(void) {int a0,b0,m0,n0;(mab)||(nab);printf("m%d\n",m);printf("n%d\n",n);return 0; } 优先级: () 优先 优先 a b -->为真&am…