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

Leetcode刷题之经典双指针问题

        光是话不行,要紧的是做。                           ——鲁迅

目录

 

一.什么是双指针问题?

二.最接近的三数之和

第一种暴力法:

第二种双指针: 

三.移除元素

第一种暴力法:

第二种双指针: 

四.盛最多水的容器 

一.什么是双指针问题?

双指针,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。

换言之,双指针法充分使用了数组有序这一特征,从而在某些情况下能够简化一些运算。


第一种快慢指针:

快慢指针也是双指针,但是两个指针从同一侧开始遍历数组,将这两个指针分别定义为快指针(fast)和慢指针(slow),两个指针以不同的策略移动,直到两个指针的值相等(或其他特殊条件)为止,如 fast 每次增长两个,slow 每次增长一个。
 

第二种对撞指针:

对撞指针是指在数组中,将指向最左侧的索引定义为左指针(left),最右侧的定义为右指针(right),然后从两头向中间进行数组遍历。


对撞数组适用于连续数组和字符串,也就是说当你遇到题目给定连续数组和字符床时,应该第一时间想到用对撞指针解题。

二.最接近的三数之和

给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。

返回这三个数的和。

假定每组输入只存在恰好一个解。

示例 1:

输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。


示例 2:

输入:nums = [0,0,0], target = 1
输出:0

做题链接:最接近的三数之和

第一种暴力法:

求最接近的三数之和,使用三个循环依次遍历整个数组,枚举出所有的可能,从而推算出最接近的,但是此算法时间复杂度为O(N^3)。力扣上是运行不过的,这里我们只是作为一个参考。 

#include<stdio.h>
#include<math.h>
int threeSumClosest(int* nums, int numsSize, int target)
{int i = 0;int j = 0;int k = 0;int temp = nums[0] + nums[1] + nums[2];for (i = 0; i < numsSize; i++){for (j = i + 1; j < numsSize; j++){for (k = j + 1; k < numsSize; k++){int sum = nums[i] + nums[j] + nums[k];if (abs(sum- target) < abs(temp - target))//abs是绝对值的意思{//如果sum- target的绝对值更小,说明sum更接近target的值temp = sum;}}}}return temp;
}
int main()
{int nums[10] = { 0 };int numsSize = 0;int target = 0;scanf("%d %d", &numsSize, &target);int i = 0;for (i = 0; i < numsSize; i++){scanf("%d", &nums[i]);}int ret = threeSumClosest(nums, numsSize, target);printf("%d", ret);return 0;
}

第二种双指针: 

此算法需要先把数组从小到大进行排序,排好序之后。因为这里是三个数,而双指针操作的是两个数,这里我们就需要先定下一个数,然后左指针指向定的下一个数,右指针指向最右边的数。

int cmp_int(const void* a, const void* b)
{return *(int*)a - *(int*)b;
}
int threeSumClosest(int* nums, int numsSize, int target) {qsort(nums, numsSize, sizeof(int), cmp_int);//使用快排进行排序int best = nums[0] + nums[1] + nums[2];for (int i = 0; i < numsSize; i++){int left = i + 1;int right = numsSize - 1;while (left < right){int min = nums[i] + nums[left] + nums[left + 1];//先来算出最小值,如果target比最小值还小,后面代码就不用进行了,直接breakif (target < min){if (abs(min - target) < abs(best - target)){best = min;}break;}int max = nums[i] + nums[right] + nums[right - 1];//如果target比最大值还大,直接breakif (target > max){if (abs(max - target) < abs(best - target)){best = max;}break;}int sum = nums[i] + nums[left] + nums[right];if (sum == target)//有可能会出现相等的情况,相等了就直接返回{return target;}if (abs(sum - target) < abs(best - target)){best = sum;}if (sum > target){right--;}else{left++;}}}return best;
}

三.移除元素

给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

示例 1:

输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。


示例 2:

输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,4,0,3]
解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。

做题链接:移除元素

第一种暴力法:

遍历数组,如果在数组中找到了val,则把数组后面的内容全部向前移动一位,把val给覆盖掉,依次类推,直到把数组里面等于val的值全部给覆盖掉。

最坏的情况就是数组里面的值全是val,则时间复杂度为O(N^2)。

int removeElement(int* nums, int numsSize, int val)
{int i = 0;int j = 0;int count = 0;for (i = 0; i < numsSize; i++){if (nums[i] == val){for (j = i; j < numsSize-1; j++){nums[j] = nums[j + 1];}i--;//使下一次判断时,回到上次判断的位置numsSize--;//进入一次if语句,则数组的大小就会减少一个}}return numsSize;
}
int main()
{int nums[10] = { 0 };int numsSize = 0;int val = 0;scanf("%d %d", &numsSize, &val);int i = 0;for (i = 0; i < numsSize; i++){scanf("%d", &nums[i]);}int ret = removeElement(nums, numsSize,val);int j = 0;for (j = 0; j < ret; j++){printf("%d ", nums[j]);}return 0;
}

第二种双指针: 

int removeElement(int* nums, int numsSize, int val)
{int dst=0;int src=0;while(dst<numsSize){if(nums[dst]!=val){nums[src]=nums[dst];src++;}dst++;}return src;
}

四.盛最多水的容器 

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

说明:你不能倾斜容器。

 

示例1:

输入:[1,8,6,2,5,4,8,3,7]
输出:49 
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为7*7= 49。


示例 2:

输入:height = [1,1]
输出:1

做题链接:盛最多水的容器

这道题还是使用双指针的方法来求:

int max(int x, int y)
{return x > y ? x : y;
}
int min(int x, int y)
{return x < y ? x : y;
}
int maxArea(int* height, int heightSize)
{int left = 0;int right = heightSize - 1;int maxarea = 0;while (left < right){maxarea = max(maxarea, min(height[left], height[right]) * (right - left));//min是求装水的最大高度,肯定以最低的那条线为准,不然就漏水了//right-left就是底边的长if (height[left] > height[right])//说明height[right]此时是短的那根线,需要right--,往前找其他的线right--;elseleft++;}return maxarea;
}

你的点赞,评论,收藏加关注都是我前进的动力。感谢!

相关文章:

Leetcode刷题之经典双指针问题

光是话不行&#xff0c;要紧的是做。 ——鲁迅 目录 一.什么是双指针问题&#xff1f; 二.最接近的三数之和 第一种暴力法&#xff1a; 第二种双指针&#xff1a; 三.移除元素 第一种暴力法&#xff1a; 第二种双指针&#xff1a; 四.盛最…...

C语言学习之路--指针篇

目录一、前言二、指针一、指针是什么1、指针的重要理解2、指针变量3、其他问题二、指针和指针类型1、指针—整数2、指针的解引用三、野指针1、野指针成因2、如何规避野指针四、指针的运算1、指针—指针2、指针的关系运算五、指针和数组六、二级指针七、指针数组一、前言 本人是…...

吃透Java面试题,建议收藏

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点&#xff0c;欢迎star~ Github地址&#xff1a;https://github.com/…...

华为OD机试题,用 Java 解【最差产品奖】问题 | 含解题说明

华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典本篇题目:最差产品奖 题目 A 公司准备对…...

Redis缓存优化

数据库在用户数量多&#xff0c;系统访问量大的时候&#xff0c;系统性能会下降&#xff0c;用户体验差。1.缓存优化作用&#xff1a;1.降低数据库的访问压力2.提高系统的访问性能3.从而提高用户体验实现思路&#xff1a;1.先查询缓存2.如果缓存有数据&#xff0c;直接返回3.如…...

少儿Python每日一题(23):楼梯问题

原题解答 本次的题目如下所示: 楼梯有n阶台阶,上楼可以一步上1阶,也可以一步上2阶,走完n阶台阶共有多少种不同的走法? 输入格式: 输入楼梯的阶梯数n 输出格式: 输出不同走法的个数 输入样例: 10 输出样例: 89 这是一道非常经典的题目,我们可以先寻找一下上楼梯的规律…...

【Leetcode】队列实现栈和栈实现队列

目录 一.【Leetcode225】队列实现栈 1.链接 2.题目再现 3.解法 二.【Leetcode232】栈实现队列 1.链接 2.题目再现 3.解法 一.【Leetcode225】队列实现栈 1.链接 队列实现栈 2.题目再现 3.解法 这道题给了我们两个队列&#xff0c;要求去实现栈&#xff1b; 首先&…...

(一)Tomcat源码阅读:查看官网,厘清大概轮廓

一、进入官网 点击以下链接进入官网:Apache Tomcat - Welcome!,点击介绍进入介绍&#xff0c;查看tomcat的项目结构。 二、查看项目结构 进入介绍后&#xff0c;我们可以看到下面的这些东西&#xff0c;这些对于tomcat是比较重要的&#xff0c;我们要一一对其进行解读。 这段…...

刷题记录(2023.3.14 - 2023.3.18)

[第五空间 2021]EasyCleanup 临时文件包含考点 分析源码&#xff0c;两个特殊的点&#xff0c;一个是 eval&#xff0c;另一个是 include eval 经过了 strlen filter checkNums 三个函数 include 经过了 strlen filter 两个函数 filter 检测是否包含特定的关键字或字符 fun…...

http协议 - 笔记

1 http协议 -- post,get,delete 如何使用http协议post - /api/v1/User/1 要使用 HTTP 协议 POST 方法向 /api/v1/User/1 发送请求,您可以使用一个 HTTP 客户端(例如 Postman、cURL 或浏览器扩展程序)并按照以下步骤操作: 打开您的 HTTP 客户端。在 URL 地址栏中输入 /a…...

第十八天 Vue-前端工程化总结

目录 Vue-前端工程化 1. 前后端分离开发 1.1 介绍 1.2 Yapi 2. 前端工程化 2.1 环境准备 2.2 Vue项目简介 2.3 Vue项目开发流程 3. Vue组件库Element 3.1 快速入门 3.2 常用组件 3.3 案例 Vue-前端工程化 前面我们已经讲解了HTML、CSS、JavaScript以及Vue等知识。已…...

python网上选课系统django-PyCharm

学生选课信息管理系统&#xff0c;可以有效的对学生选课信息、学生个人信息、教师个人信息等等进行管理。 开发语言&#xff1a;Python 框架&#xff1a;django Python版本&#xff1a;python3.7.7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat11 开发软件&#x…...

Java序列化与反序列化

优秀博文&#xff1a;IT-BLOG-CN 序列化&#xff1a;把对象转换为字节序列存储于磁盘或者进行网络传输的过程称为对象的序列化。 反序列化&#xff1a;把磁盘或网络节点上的字节序列恢复到对象的过程称为对象的反序列化。 一、序列化对象 【1】必须实现序列化接口Serializabl…...

【网络】网络层协议——IP

目录网络层IP协议IP基础知识IP地址IP报头格式网段划分CIDR特殊的IP地址IP地址的数量限制私有IP地址和公有IP地址路由IP总结网络层 在复杂的网络环境中确定一个合法的路径。 IP协议 IP协议作为整个TCP/IP中至关重要的协议&#xff0c;主要负责将数据包发送给最终的目标计算机…...

安装kubernetes

master110.10.10.10docker、kubelet、kubeadm、kubectlmaster210.10.10.11docker、kubelet、kubeadm、kubectlnode110.10.10.12docker、kubelet、kubeadm、kubectlnode210.10.10.13docker、kubelet、kubeadm、kubectl 1.关闭防火墙&#xff08;所有节点执行&#xff09; syste…...

三维点云转深度图

文章目录 目录 一、算法原理 算法流程 二、代码实现 1.Python代码 2....

Qt音视频开发27-ffmpeg视频旋转显示

一、前言 用手机或者平板拍摄的视频文件&#xff0c;很可能是旋转的&#xff0c;比如分辨率是1280x720&#xff0c;确是垂直的&#xff0c;相当于分辨率变成了720x1280&#xff0c;如果不做旋转处理的话&#xff0c;那脑袋必须歪着看才行&#xff0c;这样看起来太难受&#xf…...

python例程:《彩图版飞机大战》程序

目录开发环境要求运行方法《彩图版飞机大战》程序使用说明源码示例源码及说明文档下载路径开发环境要求 本系统的软件开发及运行环境具体如下。 操作系统&#xff1a;Windows 7、Windows 10。 Python版本&#xff1a;Python 3.7.1。 开发工具&#xff1a;PyCharm 2018。…...

【前端八股文】JavaScript系列:Set、Map、String常用属性方法

文章目录Set概念与arr的比较属性和方法并集、交集、差集Map概念属性和方法String用索引值和charAt()的区别charAt()和charCodeAt()方法的区别5个查找方法的区别如何把字符串分割为数组3个截取方法的区别大小写转换3个模式匹配方法&#xff08;正则表达式&#xff09;3个移除字符…...

跳跃-动态规划问题

跳跃-动态规划问题1、题目描述2、解题思路2.1 解法一&#xff1a;动态规划2.2 解法二&#xff1a;DFS深度优先搜索最大权值1、题目描述 小蓝在一个 n 行 m 列的方格图中玩一个游戏。 开始时&#xff0c;小蓝站在方格图的左上角&#xff0c;即第 11 行第 11 列。 小蓝可以在方格…...

Qt, C++数据类型扩展问题

Qt项目中ObjectDic类的类型扩展与代码优化 前言 在Qt项目开发中&#xff0c;我们经常会遇到需要处理不同类型数据的情况&#xff0c;尤其是当涉及到负数时&#xff0c;类型的选择就显得尤为重要。本文将详细介绍如何在Qt项目中扩展ObjectDic类的类型支持&#xff0c;从无符号整…...

成都美容院灯箱技术白皮书:2024年行业趋势与落地实践指南

美容院灯箱&#xff1a;不只是照明&#xff0c;更是品牌灵魂的窗口走进任何一条成都的商业街&#xff0c;你很难忽视那些光彩夺目的美容院灯箱。它们不仅仅是照明工具&#xff0c;更是品牌形象的第一道防线。有趣的是&#xff0c;很多人会误以为灯箱只是‘打个光’那么简单&…...

选择性记忆提取,把人类遗忘机制用在了RAG上,这架构真有点东西

当前大模型处理长文本面临三大瓶颈&#xff1a;算力爆炸&#xff1a;传统注意力机制随文本长度呈二次方增长&#xff08;O(N)&#xff09;&#xff0c;百万级token直接OOMRAG碎片化&#xff1a;检索增强生成将文档切成独立片段&#xff0c;破坏多跳推理的逻辑链条记忆遗忘&…...

[Windows 驱动] 深入解析进程名获取的多种内核方法

1. Windows驱动开发中的进程名获取基础 在Windows内核驱动开发中&#xff0c;获取进程名是最基础但至关重要的操作之一。想象一下&#xff0c;你正在开发一个安全监控驱动&#xff0c;需要实时检查哪些进程正在运行&#xff1b;或者你在开发一个性能优化工具&#xff0c;需要针…...

颠覆传统游戏体验:Sunshine云游戏串流平台让你随时随地畅玩PC游戏

颠覆传统游戏体验&#xff1a;Sunshine云游戏串流平台让你随时随地畅玩PC游戏 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 你是否曾梦想过在旅途中用平板继续昨晚未完成的3A大作…...

Open UI5 源代码解析之736:CardBase.js

源代码仓库: https://github.com/SAP/openui5 源代码位置:src\sap.f\src\sap\f\CardBase.js CardBase.js 深度解析:在 OpenUI5 中承上启下的卡片基座 文件定位与整体判断 CardBase.js 位于 sap.f 库下,它不是面向业务开发者直接频繁实例化的组件,而是一个被多种卡片实…...

AMD Ryzen硬件调试终极指南:3大突破性能优化秘籍揭秘

AMD Ryzen硬件调试终极指南&#xff1a;3大突破性能优化秘籍揭秘 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://git…...

OpenClaw数据安全:Qwen3.5-4B-Claude本地处理敏感合同

OpenClaw数据安全&#xff1a;Qwen3.5-4B-Claude本地处理敏感合同 1. 为什么法律行业需要本地化AI处理 去年我参与了一个法律科技项目&#xff0c;团队最初尝试用公有云API处理合同文本时&#xff0c;遭遇了客户对数据出海的强烈抵触。某次演示中&#xff0c;当法务总监看到合…...

SiameseUIE部署指南:test.py中custom_entities字段详解

SiameseUIE部署指南&#xff1a;test.py中custom_entities字段详解 1. 概述 如果你正在使用SiameseUIE模型进行信息抽取&#xff0c;那么test.py脚本中的custom_entities字段就是你最需要关注的核心配置。这个看似简单的字段&#xff0c;实际上决定了模型如何精准地从文本中抽…...

56:L构建蓝队AI:蓝队的智能防御

作者&#xff1a; HOS(安全风信子) 日期&#xff1a; 2026-03-07 主要来源平台&#xff1a; GitHub 摘要&#xff1a; 面对基拉等高级威胁的不断进化&#xff0c;传统的蓝队防御手段已经难以应对。L构建了一套蓝队AI系统&#xff0c;通过AI驱动的威胁检测、自动响应和防御优化&…...