LeetCode-数组-双指针-中等难度

文章目录

  • 双指针
    • 1. 删除有序数组中的重复项(入门)
      • 1.1 题目描述
      • 1.2 解题思路
      • 1.3 代码实现
    • 2. 删除有序数组中的重复项 II(简单)
      • 2.1 题目描述
      • 2.2 解题思路
      • 2.3 代码实现
    • 3. 移动零(简单)
      • 3.1 题目描述
      • 3.2 代码实现
    • 4. 两数之和(入门)
      • 4.1 题目描述
      • 4.2 解题思路
      • 4.3 代码实现
    • 5. 盛水最多的容器(中等)
      • 5.1 题目描述
      • 5.2 解题思路
      • 5.3 代码实现
    • 6. 三数之和(中等)
      • 6.1 题目描述
      • 6.2 解题思路
      • 6.3 代码实现
    • 7. 最接近的三数之和(中等)
      • 7.1 题目描述
      • 7.2 解题思路
      • 7.3 代码实现
    • 8. 接雨水(中等)
      • 8.1 题目描述
      • 8.2 解题思路
      • 8.3 代码实现

双指针

双指针一般是指利用两个变量,通过在线性的结构上进行遍历来解决某些特定的问题,按照遍历的方式一般多采用:同向遍历,相向遍历两种方式,例如冒泡排序、选择排序、插入排序都是用了两个变量同向遍历来实现,快排则是通过相向遍历来实现。

1. 删除有序数组中的重复项(入门)

1.1 题目描述

在这里插入图片描述

1.2 解题思路

快慢指针的简单应用

1.3 代码实现

public int removeDuplicates(int[] nums) {int n = nums.length;int p1 = 0;int p2 = 1;while (p2 < n) {if (nums[p1] != nums[p2]) {nums[++p1] = nums[p2];}p2++;}return p1 + 1;
}

leetcode跳转:26. 删除有序数组中的重复项

2. 删除有序数组中的重复项 II(简单)

2.1 题目描述

在这里插入图片描述

2.2 解题思路

与前一题结合在一起看,就是保留前X个相同数字,超过X个后,再进行比较,所以快指针逻辑不变,只需要让慢指针在比较时每次往前取两位即可。

2.3 代码实现

public int removeDuplicates(int[] nums) {int n = nums.length;if (n <= 2) {return n;}int p1 = 2;int p2 = 2;while (p2 < n) {if (nums[p1 - 2] != nums[p2]) {nums[p1] = nums[p2];p1++;}p2++;}return p1;
}

leetcode跳转:80. 删除有序数组中的重复项II

3. 移动零(简单)

3.1 题目描述

在这里插入图片描述

3.2 代码实现

public void moveZeroes(int[] nums) {int zero = 0;for (int i = 0; i < nums.length; i++) {if (nums[i] != 0) {int t = nums[i];nums[i] = 0;nums[zero] = t;zero++;}}
}

leetcode跳转:283. 移动零

4. 两数之和(入门)

4.1 题目描述

在这里插入图片描述

4.2 解题思路

左右指针,相向遍历

4.3 代码实现

public int[] twoSum(int[] numbers, int target) {int n = numbers.length;int left = 0;int right = n - 1;while (left < right) {int sum = numbers[left] + numbers[right];if (sum == target) {return new int[]{left + 1, right + 1};} else if (sum > target) {right--;} else {left++;}}return null;
}

leetCode跳转:167. 两数之和 II - 输入有序数组

5. 盛水最多的容器(中等)

5.1 题目描述

在这里插入图片描述

5.2 解题思路

同样是一道左右指针,相向遍历的题,每次移动较短的柱子,盛水最多的容器,即为:间距 * min(left, right)

5.3 代码实现

public int maxArea(int[] height) {int n = height.length;int left = 0;int right = n - 1;int ans = 0;while (left < right) {int min = Math.min(height[left], height[right]);ans = Math.max(ans, min * (right - left));if (height[left] < height[right]) {left++;} else {right--;}}return ans;
}

leetCode跳转:11. 盛水最多的容器

6. 三数之和(中等)

6.1 题目描述

在这里插入图片描述

6.2 解题思路

排序+双指针也是常见的组合解法,本题只需要排序后,再进行枚举即可。
在这里插入图片描述

两处优化
在这里插入图片描述

6.3 代码实现

public List<List<Integer>> threeSum(int[] nums) {Arrays.sort(nums);List<List<Integer>> ans = new ArrayList<>();int n = nums.length;for (int i = 0; i < n - 2; i++) {if (i > 0 && nums[i] == nums[i - 1]) {continue;}if (nums[i] + nums[n - 1] + nums[n - 2] < 0) {continue;}if (nums[i] + nums[i + 1] + nums[i + 2] > 0) {break;}int k = n - 1;for (int j = i + 1; j < k; 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) {List<Integer> list = new ArrayList<>();list.add(nums[i]);list.add(nums[j]);list.add(nums[k]);ans.add(list);}}}return ans;
}

leetCode跳转:15. 三数之和

7. 最接近的三数之和(中等)

7.1 题目描述

在这里插入图片描述

7.2 解题思路

解法同三数之和

7.3 代码实现

public int threeSumClosest(int[] nums, int target) {Arrays.sort(nums);int ans = Integer.MAX_VALUE;int n = nums.length;for (int i = 0; i < n - 2; i++) {int j = i + 1;int k = n - 1;while (j < k) {int sum = nums[i] + nums[j] + nums[k];if (sum == target) {return sum;}// 接近三数之和if (Math.abs(sum - target) < Math.abs(ans - target)) {ans = sum;}if (sum > target) {k--;} else {j++;}}}return ans;
}

leetCode跳转:16. 最接近的三数之和

8. 接雨水(中等)

8.1 题目描述

在这里插入图片描述

8.2 解题思路

左右指针,相向遍历。
要求可接的雨水处的水量,可以先分别求出位于此处两侧最长柱子的高度,然后取其较短的一根即表示其可接水量的上限,因此完全可以通过不断的左右遍历(收缩较短的柱子)的方式计算出每个位置可接的水量。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8.3 代码实现

public int trap(int[] height) {int n = height.length;int leftMax = 0;int rightMax = 0;int left = 0;int right = n - 1;int ans = 0;while (left < right) {leftMax = Math.max(leftMax, height[left]);rightMax = Math.max(rightMax, height[right]);if (height[left] < height[right]) {ans += leftMax - height[left];left++;} else {ans += rightMax - height[right];right--;}}return ans;
}

leetCode跳转:42. 接雨水

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

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

相关文章

AQS应用之BlockingQueue详解

概要 AQS全称是 AbstractQueuedSynchronizer&#xff0c;中文译为抽象队列式同步器。BlockingQueue&#xff0c;是java.util.concurrent 包提供的用于解决并发生产者 - 消费者问题的最有用的类&#xff0c;它的特性是在任意时刻只有一个线程可以进行take或者put操作&#xff0…

MySQL之导入导出远程备份

目录 一. navicat导入导出 二. mysqldump命令导入导出 导入 导出 三. load data infile命令导入导出 导入 导出 四. 远程备份 导入 导出 思维导图 一. navicat导入导出 导入&#xff1a;右键➡运行SQL文件 导出&#xff1a;选中要导出的表➡右键➡转储SQL文件➡数据和结…

C# Emgu.CV4.8.0读取rtsp流录制mp4可分段保存

【官方框架地址】 https://github.com/emgucv/emgucv 【算法介绍】 EMGU CV&#xff08;Emgu Computer Vision&#xff09;是一个开源的、基于.NET框架的计算机视觉库&#xff0c;它提供了对OpenCV&#xff08;开源计算机视觉库&#xff09;的封装。EMGU CV使得在.NET应用程序…

x-cmd pkg | vhs - 将终端的操作过程录制成视频文件的终端录制工具

目录 简介首次用户声明式录制脚本其他功能竞品和相关作品进一步阅读 简介 vhs 是一个命令行录制工具&#xff0c;用于将终端的操作过程录制成视频文件。是由 Charmbracelet 团队使用 Go 开发的&#xff0c;首个版本发布于 2022 年 10 月。开源不到一个月有接近 8k 的 star。 …

Kubernetes (八) 金丝雀发布

一. 金丝雀发布作用&#xff1a; 金丝雀发布是指在生产环境中逐步推出新版本应用程序&#xff0c;只在一小部分用户或流量中使用该版本&#xff0c;并根据反馈逐步扩…

Redis(三)持久化

文章目录 RDB&#xff08;Redis Database&#xff09;自动触发保存频率修改dump文件保存路径修改文件保存名称dump恢复 手动触发save![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a56fdff44aee4efa96c2ce3615b69dc1.png)bgsave 优劣优点缺点 检查修复dump文件会触…

手把手教你使用cubemx配置串口

重写fput函数 #include <stdio.h>#ifdef __GNUC__#define PUTCHAR_PROTOTYPE int _io_putchar(int ch)#else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)#endif /* __GNUC__*//*******************************************************************brief R…

安全狗获评CCIA“2023年度先进会员单位”

1月4日&#xff0c;2023年度中国网络安全产业联盟会员大会暨理事会在北京成功举办。 作为国内云原生安全领导厂商&#xff0c;安全狗也受邀出席此次活动。 厦门服云信息科技有限公司&#xff08;品牌名&#xff1a;安全狗&#xff09;创办于2013年&#xff0c;是国内领先的云…

你的企业知识库该更新啦,这样搭建高效又轻松

很明显&#xff0c;企业知识库已经成为我们工作中必不可少的资源&#xff0c;它的价值已经不言而喻&#xff0c;无论是促进团队合作&#xff0c;还是帮助我们更有效地找到收集和使用知识&#xff0c;知识库都发挥着重要的作用&#xff0c;然而&#xff0c;你的企业知识库已经过…

springboot——消息中间件

消息的概念 从广义角度来说&#xff0c;消息其实就是信息&#xff0c;但是和信息又有所不同。信息通常被定义为一组数据&#xff0c;而消息除了具有数据的特征之外&#xff0c;还有消息的来源与接收的概念。通常发送消息的一方称为消息的生产者&#xff0c;接收消息的一方称为…

OV5640 摄像头的图像平滑处理

如图所示&#xff0c;这是整个视频采集系统的原理框图。 上电初始&#xff0c;FPGA 需要通过 IIC 接口对 CMOS Sensor 进行寄存器初始化配置。这些初始化的基本参数&#xff0c;即初始化地址对应的初始化数据都存储在一个预先配置好的 FPGA 片内 ROM中。在初始化配置完成后&…

遥感影像-语义分割数据集:云数据集详细介绍及训练样本处理流程

原始数据集详情 简介&#xff1a;该云数据集包括150张RGB三通道的高分辨率图像&#xff0c;在全球不同区域的分辨率从0.5米到15米不等。这些图像采集自谷歌Earth的五种主要土地覆盖类型&#xff0c;即水、植被、湿地、城市、冰雪和贫瘠土地。 KeyValue卫星类型谷歌Earth覆盖区…

[足式机器人]Part2 Dr. CAN学习笔记-动态系统建模与分析 Ch02-8 Bode Plot伯德图

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-动态系统建模与分析 Ch02-8 Bode Plot伯德图 Bode Plot 手绘技巧与应用

第7章-第6节-Java中的Map集合

1、HashMap&#xff1a; 1&#xff09;、 引入 如果业务需要我们去用姓名的拼音手写字母匹配完整姓名&#xff0c;那么如果用单列数据&#xff0c;我们可能需要两个集合才能存储&#xff0c;而且两个集合之间没有关联不好操作&#xff0c;这种时候双列数据就会起很大作用 2&…

【前端素材】bootstrap4实现服装鞋饰电商平台Doron

一、需求分析 一个服装鞋饰电子商务页面是一个在线平台&#xff0c;用于展示和销售各种服装、鞋子和配饰产品。它通常具有以下功能&#xff1a; 产品展示&#xff1a;服装鞋饰电子商务页面会展示各种服装、鞋子和配饰产品的图片、描述和价格。这些产品可以按照不同的分类&#…

批量剪辑方法:掌握视频剪辑技巧,按指定时长轻松分割视频

在视频制作和编辑过程中&#xff0c;经常要批量处理和剪辑大量的视频片段。学会批量剪辑方法可以提高工作效率&#xff0c;还可以使视频编辑更加准确和高效。下面来看下云炫AI智剪如何按指定时长轻松分割视频的批量剪辑方法。 分割后的视频文件效果&#xff0c;已分割分段的视…

PHPStudy快速搭建网站并结合内网穿透远程访问本地站点

文章目录 [toc]使用工具1. 本地搭建web网站1.1 下载phpstudy后解压并安装1.2 打开默认站点&#xff0c;测试1.3 下载静态演示站点1.4 打开站点根目录1.5 复制演示站点到站网根目录1.6 在浏览器中&#xff0c;查看演示效果。 2. 将本地web网站发布到公网2.1 安装cpolar内网穿透2…

减少客户流失并留住长期客户:实用策略与实践分享

一、什么是客户流失&#xff1f; 客户流失是指客户停止付费并离开您的产品/服务。流失率是指在特定时间内离开产品/服务的用户除以用户总数的百分比。 比如&#xff1a; 假设某媒体平台是一个基于订阅的流媒体平台&#xff0c;为用户提供各种电影、电视剧、纪录片等。到二月…

Linux--防火墙,实验案例:基于区域、服务、端口的访问控制

实验环境 某公司的Web服务器&#xff0c;网关服务器均采用Linux CentOS 7.3操作系统&#xff0c;如图2.13所示。为了 加强网络访问的安全性&#xff0c;要求管理员熟悉firewalld防火墙规则的编写&#xff0c;以便制定有效、可行的主机防护策略。 需求描述 > 网关服务器ens3…

RT-Thread:ADC 框架应用,通过 STM32CubeMX 配置 STM32 ADC驱动

关键词&#xff1a;ADC,RT-Thread ADC,STM32 ADC应用 说明&#xff1a;本笔记是记录如何开启 RT-Thread 框架的ADC功能&#xff0c;使用系统自带的ADC函数&#xff0c;并通过 STM32CubeMX 配置 STM32 ADC驱动 。 1. 打开board.h 文件&#xff0c;找到ADC 使用配置的流程&…