LeetCode 热题 100 | 双指针(上)

目录

1  283. 移动零

2  11. 盛最多水的容器

3  15. 三数之和


菜鸟做题第一周,语言是 C++

1  283. 移动零

解题思路:

  1. 两个指针一前一后遍历数组
  2. 前者永远指向 0,后者永远在寻找非 0 数的路上
  3. 后者找到一个非 0 数就和前者进行一个数值交换

思路说明图:

  • 上图并没有画出每一步,请自行脑补
  • 由上图可见,i 始终指向 0,j 的作用就是寻找非 0 数
  • 一旦找到就进行交换

思考过程:

本菜鸟一开始交换两数还用的是最传统的 temp 三步法,结果被 swap 函数一把子秒了!对于双指针,既然 i 和 j 必须是一前一后地移动(毕竟自己没有和自己交换的必要),那为什么初始化的时候要令 j 等于 i 呢?这是因为 nums 的长度可能为 1,你初始化 j = 1 就越界了。

class Solution {
public:void moveZeroes(vector<int>& nums) {int i = 0, j = 0;while (j < nums.size()) {if (nums[j] != 0) {swap(nums[i], nums[j]);++i;}++j;}}
};

每完成一次交换,i 就要向右移动一格,毕竟之前的序列已经处理好了。无论交不交换,j 都要向右移动一格。若交换,则代表 j 当前指向 0;若没交换,则还是代表 j 当前指向 0 。而 j 是用来寻找非 0 数的,因此必须向右移动。

2  11. 盛最多水的容器

解题思路:

  1. 两个指针一头一尾遍历数组
  2. 若左侧更低则左边的指针移动,若右侧更低则右边的指针移动
  3. 每次移动完就计算新的面积,并和历史最大面积做比较

思路说明图:

这里我们的移动标准是 “哪侧的边矮,我们就移动哪侧”。为什么这样做呢?难道不会遗漏更好的组合吗?举个例子,对于初始组合 1 和 9,面积的高度等于 1 这个矮边,又因为 9 离 1 最远,所以面积的宽度已经取到了极值,这就是针对 1 这个矮边的最大面积了!我们再怎么移动右侧的边也不能使面积增大。

同样地,当左侧的边移动到 2 时,9 成了矮边。在保证 9 是矮边的条件下,2 又是离 9 最远的,所以面积的宽度已经取到了极值,这就是针对 9 这个矮边的最大面积了!我们再怎么移动左侧的边也不能使面积增大。

class Solution {
public:int maxArea(vector<int>& height) {int i = 0, j = height.size() - 1;int area = min(height[i], height[j]) * (j-i);while (i != j) {if (height[i] < height[j]) {++i;} else if (height[i] > height[j]) {--j;} else {++i;}area = max(area, min(height[i], height[j]) * (j-i));}return area;}
};

3  15. 三数之和

解题思路:

  1. 为数组排序
  2. 进行三层循环,每层循环针对三数中的一个
  3. 第二层和第三层体现了双指针,一个从头开始,一个从尾开始

思路说明图:

1)双指针

传统的三层循环如 method1 所示,即 i、j 和 k 都是从左至右遍历数组。但是因为排序后的数字是按从小到大的顺序排序的,并且要求 nums[i] + nums[j] + nums[k] == 0 。又由于 i 和 j 是从左至右遍历的,nums[i] + nums[j] 会变得越来越大,因此 nums[k] 应该越来越小!这就要求 k 从右至左进行遍历,如 method2 所示。

2)避免重复

if (i > 0 && nums[i] == nums[i - 1]) continue;

这行代码是为了避免三元组出现重复。如上图所示,我们只看第一层循环。

当 i 等于第一个 -4 的时候,j 和 k 屁颠屁颠地给 i 找满足要求的组合,它们考虑的数字包含 {-4, -1, -1, 0, 1, 2, 2} 。当 i 等于第二个 -4 的时候,j 和 k 还是屁颠屁颠地给 i 找满足要求的组合,它们考虑的数字包含 {-1, -1, 0, 1, 2, 2} 。

这里少考虑了一个 -4 会影响结果吗?答案是并不会。只能说为第二个 -4 找的三元组可能比为第一个 -4 找的少一个罢了(如果数组里还有个 8 的话,就会少一个 {-4, -4, 8})但这并不影响啊,题目要求的就是不能重复!所以我们索性跳过第二个 -4,反正为它找的三元组已经存在了。

类似地,针对 j 也有这样的 if 语句。

if (j > i + 1 && nums[j] == nums[j - 1]) continue;

3)第三层循环

按理说,第三层循环也拿 for 做不就好了吗,条件为 j < k,只要 --k 就好了呀,但会超时……

还是那个思路 “能少循环就少循环”。

while (j < k && nums[i] + nums[j] + nums[k] > 0) --k;

这里有两个条件。一个是 j 不能遇上 k,它避免了 nums[k] 和 nums[i]、nums[j] 取到同一个位置的值;另一个是 nums[i] + nums[j] + nums[k] > 0,它避免了 nums[i] + nums[j] + nums[k] <= 0 以后,k 还在一个劲儿地往左移。

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> result;sort(nums.begin(), nums.end());// 第一层循环for (int i = 0; i < nums.size(); ++i) {if (i > 0 && nums[i] == nums[i - 1]) continue;int k = nums.size() - 1;// 第二层循环for (int j = i + 1; j < nums.size(); ++j) {if (j > i + 1 && nums[j] == nums[j - 1]) continue;// 第三层循环while (j < k && nums[i] + nums[j] + nums[k] > 0) --k;// 处理循环结果if (j == k) break;if (nums[i] + nums[j] + nums[k] == 0) {result.push_back({nums[i], nums[j], nums[k]});}}}return result;}
};

这道题最离谱的是把 int k = nums.size() - 1; 改写到第二层循环里也会超时啊!?

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

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

相关文章

x-cmd pkg | jieba - 中文结巴分词工具

目录 简介首次用户功能特点竞品分析进一步阅读 简介 结巴中文分词&#xff08;jieba&#xff09;是一款在 Python 环境下使用的开源中文文本分词工具。它支持多种分词模式&#xff0c;包括精确模式、全模式和搜索引擎模式&#xff0c;同时支持繁体分词和自定义词典。因其易用性…

[202401C]巨人之力的题解

原题描述&#xff1a; 时间限制: 1000ms 空间限制: 262144kb 题目描述 两千多年以前&#xff0c;身为艾尔迪亚人的尤弥尔意外获得巨人之力&#xff0c;并且创造了九大巨人&#xff0c;其无以匹敌的力量使得整个世界都陷入了无尽的战乱纷争&#xff0c;艾尔迪亚之外的人类过…

docker-compose直接官网二进制文件安装(linux)

试了很多种方法&#xff0c;国内镜像库安装&#xff0c;会报语法错误 直接用github官网&#xff0c;命令安装下载太慢&#xff0c;还不如魔法下载 官网链接docker-compose-linux-x86_64https://github.com/docker/compose/releases/download/v2.24.1/docker-compose-linux-x8…

温度采样【通道选通】S9KEAZ128的PTA2和PTA3引脚无法拉高

1、问题记录&#xff1a;由18串温度采样修改成32串温度采样&#xff0c;增加一路adc采样&#xff0c;通过cd4051控制通道选通&#xff0c;代码中增加了相应的代码&#xff0c;发现增加的最后8路温度不能够控制&#xff0c;以24串为例&#xff0c;给温度传感器增加温度&#xff…

pytorch(四)、完整小网络的搭建和sequential的使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言搭建小网络和sequential的使用一、 第一种形式如下&#xff1a;二、第二种方式&#xff0c;使用sequential 前言 至此&#xff0c;神经网络的基础部分就基本结…

解决Spring Boot跨域问题(配置JAVA类)

什么是跨域问题 跨域问题指的是不同端口之间&#xff0c;使用 ajax 无法相互调用的问题。跨域问题本质是浏览器的一种保护机制&#xff0c;它是为了保证用户的安全&#xff0c;防止恶意网站窃取数据。 比如前端用的端口号为8081&#xff0c;后端用的端口号为8080&#xff0c;后…

C语言从入门到实战——编译和链接

编译和链接 前言一、 翻译环境和运行环境二、 翻译环境2.1 预处理&#xff08;预编译&#xff09;2.2 编译2.2.1 词法分析2.2.2 语法分析2.2.3 语义分析 2.3 汇编2.4 链接 三、 运行环境 前言 在C语言中&#xff0c;编译和链接是将源代码转换为可执行文件的两个主要步骤。 编…

MacBookPro怎么数据恢复? mac电脑数据恢复?

使用电脑的用户都知道&#xff0c;被删除的文件一般都会经过回收站&#xff0c;想要恢复它直接点击“还原”就可以恢复到原始位置。mac电脑同理也是这样&#xff0c;但是“回收站”在mac电脑显示为“废纸篓”。 如果电脑回收站&#xff0c;或者是废纸篓里面的数据被清空了&…

App 测试工具大全,收藏这篇就够了

随着移动互联网的高速发展&#xff0c;App应用非常火&#xff0c;测试工程师也会接触到各种app应用。除了人工测试之外&#xff0c;也可以通过一些测试工具来提高我们的测试效率&#xff0c;以下对于我用过或听过的app测试工具做了一个统一整理&#xff0c;欢迎补充。 一、APP自…

【51单片机Keil+Proteus8.9+ADC0804】ADC实验 模拟转数字实验

一、实验名称 ADC实验 模拟转数字实验 二、设计思路 电路设计 1.选用AT89C51单片机作为电路核心单元&#xff0c;外接8位单通道AD转换器ADC0804芯片和LM016L显示器以及滑动变阻器等其它常用元器件构成电路。 2.将ADC0804芯片的控制引脚RD,WR,INTR接到AT89C51芯片对应引脚&…

Spring Boot程序的打包与运行:构建高效部署流程

引言 在现代应用开发中&#xff0c;高效的打包和部署流程对于项目的开发、测试和上线至关重要。Spring Boot作为一种快速开发框架&#xff0c;提供了方便的打包工具和内嵌式的Web服务器&#xff0c;使得打包和运行变得更加简单。本文将研究在Spring Boot应用中如何进行打包&am…

外包干了5个月,技术退步明显...

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

【数据库】聊聊InnoDB存储引擎结构

在学习任何技术、框架、中间件的时候&#xff0c;我们都需要从一个宏观的角度先去了解一下大概视角&#xff0c;然后在通过剖定解牛的方式进行细分点的学习&#xff0c;同样对于任何存储结构来说&#xff0c;基本上都包含几块内容。 通信&#xff1a;解决信息传输问题、存储模型…

k8s资源介绍

Kubernetes架构图 Kubernetes系统用于管理分布式节点集群中的微服务或容器化应用程序&#xff0c;并且其提供了零停机时间部署、自动回滚、缩放和容器的自愈&#xff08;其中包括自动配置、自动重启、自动复制的高弹性基础设施&#xff0c;以及容器的自动缩放等&#xff09;等…

上海智慧岛大数据云计算中心项目正式封顶!

上海智慧岛大数据云计算中心封顶仪式现场 1月15日&#xff0c;云端股份在上海智慧岛大数据云计算中心举行封顶仪式。云之端网络&#xff08;江苏&#xff09;股份有限公司&#xff08;以下称“云端股份”&#xff09;总经理贡伟力先生&#xff0c;常务副总张靖先生等公司成员&…

VS生成C++动态链接库DLL

1、官方文档&#xff1a; 在 Visual Studio 中创建 C/C DLL | Microsoft Learn 演练&#xff1a;创建和使用自己的动态链接库 (C) | Microsoft Learn 创建和调用步骤&#xff0c;主要按照第二篇操作。 一、建立DLL项目生成库文件 直接建立C的DLL项目&#xff0c;注意叙述&am…

Docker(八)高级网络配置

作者主页&#xff1a; 正函数的个人主页 文章收录专栏&#xff1a; Docker 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01; 高级网络配置 注意&#xff1a;本章属于 Docker 高级配置&#xff0c;如果您是初学者&#xff0c;您可以暂时跳过本章节&#xff0c;直接学习…

广东金牌电缆:法大大电子合同助力业务风险管控

广东金牌电缆集团股份有限公司&#xff08;以下简称“广东金牌电缆”&#xff09;成立于2013年&#xff0c;现为广东省电线电缆重点生产企业、广东省守合同重信用单位、国家专精特新小巨人企业、国家高新技术企业&#xff0c;拥有自主商标“夺冠”&#xff0c;“夺冠”商标被评…

Python 中多线程与多处理之间的区别

一、说明 在本文中&#xff0c;我们将学习 Python 中多线程和多处理的内容、原因和方式。在我们深入研究代码之前&#xff0c;让我们了解这些术语的含义。 二、基本术语和概念 程序是一个可执行文件&#xff0c;它由一组执行某些任务的指令组成&#xff0c;通常存储在计算机的…

IntelliJ IDEA 常用快捷键一览表(通用型,提高编写速度,类结构、查找和查看源码,替换与关闭,调整格式)

文章目录 IntelliJ IDEA 常用快捷键一览表1-IDEA的日常快捷键第1组&#xff1a;通用型第2组&#xff1a;提高编写速度&#xff08;上&#xff09;第3组&#xff1a;提高编写速度&#xff08;下&#xff09;第4组&#xff1a;类结构、查找和查看源码第5组&#xff1a;查找、替换…