leetcode双指针题目总结

文章目录

  • 283. 移动零
    • 题目描述
    • 解题
  • 11. 盛最多水的容器
    • 题目描述
    • 解法
      • 解释
      • 时间复杂度
  • 15. 三数之和
    • 题目描述
    • 解法
      • 思路
      • 解释
      • 优势
  • 42. 接雨水
    • 题目描述
    • 解答
      • 具体思路

283. 移动零

题目描述

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]

示例 2:

输入: nums = [0]
输出: [0]

提示:

  • 1 <= nums.length <= 104
  • -231 <= nums[i] <= 231 - 1

**进阶:**你能尽量减少完成的操作次数吗?

解题

class Solution:def moveZeroes(self, nums: List[int]) -> None:ts = 0for i in range(len(nums)):if nums[i] != 0:nums[ts] = nums[i]ts += 1for i in range(ts, len(nums)):nums[i] = 0return nums

11. 盛最多水的容器

题目描述

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

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

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

**说明:**你不能倾斜容器。

示例 1:

img

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

示例 2:

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

提示:

  • n == height.length
  • 2 <= n <= 105
  • 0 <= height[i] <= 104

解法

我们可以使用双指针(一个从列表的开头、一个从末尾)来找到最大面积。每次根据当前的两个指针对应的高度计算面积,然后移动较短的指针向内靠拢。移动较短的指针是因为面积取决于最短的高度,因此移动较短的指针才有可能增加面积。

class Solution:def maxArea(self, height: List[int]) -> int:left =0right = len(height) - 1max_area = 0while left < right:current_area = (right-left) * min(height[left],height[right])max_area = max(max_area, current_area)if height[left] < height[right]:left += 1else:right -= 1return max_area

解释

  • leftright 分别是双指针,初始时分别指向列表的两端。
  • 每次计算当前指针对应的面积并更新 max_area
  • 选择高度较小的指针向内移动,以尝试获得更大的面积。
  • 循环终止时,max_area 就是最大面积。

时间复杂度

该算法的时间复杂度为 O(n),因为每次只移动一个指针。

15. 三数之和

题目描述

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != kj != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。

**注意:**答案中不可以包含重复的三元组。

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
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] 。
注意,输出的顺序和三元组的顺序并不重要。

示例 2:

输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。

示例 3:

输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。

提示:

  • 3 <= nums.length <= 3000
  • -105 <= nums[i] <= 105

解法

思路

使用 排序 + 双指针法 来降低时间复杂度,步骤如下:

  1. 排序数组:先对 nums 进行排序,以方便使用双指针。

  2. 遍历数组,固定一个元素:使用一个循环来固定第一个元素 nums[i],并跳过重复的元素以避免重复解。

  3. 双指针寻找匹配的三元组

    • 使用两个指针 leftright,分别指向 i+1 和数组的最后一个元素。

    • 计算三个数的和

      sum = nums[i] + nums[left] + nums[right]
      
      • 如果 sum == 0,则找到一个三元组,将其加入结果。
      • 如果 sum < 0,说明和太小,移动 left 指针以增大和。
      • 如果 sum > 0,说明和太大,移动 right 指针以减小和。
    • 移动指针时,跳过重复元素以避免重复解。

class Solution:def threeSum(self, nums: List[int]) -> List[List[int]]:nums = sorted(nums)lis = []for i in range(len(nums)):if i > 0 and nums[i] == nums[i-1]:continueleft, right = i+1, len(nums) - 1while left < right:total = nums[i] + nums[left] + nums[right]if total == 0:lis.append([nums[i], nums[left], nums[right]])while left < right and nums[left] == nums[left+1]:left += 1while left < right and nums[right] == nums[right-1]:right -= 1left += 1right -= 1elif total < 0:left += 1else:right -= 1return lis

解释

  • 排序后的数组方便使用双指针,并且可以通过跳过相邻相同的元素来避免重复三元组。
  • 外部循环固定第一个元素,双指针在剩下的部分查找符合条件的三元组。
  • 总时间复杂度为 O((n^2),比原方法更高效。

优势

这种方法通过减少嵌套循环,提高了效率,适合处理较大的输入。

42. 接雨水

题目描述

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

示例 1:

img

输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 

示例 2:

输入:height = [4,2,0,3,2,5]
输出:9

提示:

  • n == height.length
  • 1 <= n <= 2 * 104
  • 0 <= height[i] <= 105

解答

具体思路

假设这些柱子之间会积水,那么每根柱子上能积多少水,取决于它左边和右边最高的柱子。这是因为水会被高的柱子“挡住”,从而在矮的柱子处积水。

  1. 双指针法
    • 我们用两个指针 leftright,分别从数组的两端(左边和右边)开始。
    • left 从左往右移动,right 从右往左移动。
  2. 维护两个变量来记录两侧的最高柱子
    • left_max:记录从左侧到当前 left 指针位置的最高柱子高度。
    • right_max:记录从右侧到当前 right 指针位置的最高柱子高度。
  3. 积水量的计算逻辑
    • 每根柱子积水的量取决于它左边和右边的最高柱子,因为水只会停留在比它高的柱子之间。
    • 如果 left_max比 right_max 矮,则意味着:
      • 左边柱子高度小,左边的 left_max 是决定 left 柱子能否积水的因素。
      • 如果 left_max 高于 height[left],则 height[left] 可以积水 left_max - height[left] 的量。
      • 否则,我们更新 left_max
      • 然后 left 指针右移一格,继续这个过程。
    • 如果 right_max小于等于 left_max,那么 right柱子能否积水,取决于 right_max
      • 如果 right_max 大于 height[right],则 height[right] 可以积水 right_max - height[right] 的量。
      • 否则,我们更新 right_max
      • 然后 right 指针左移一格,继续这个过程。
  4. 终止条件
    • leftright 相遇时,整个遍历结束,此时计算出的 water_trapped 就是所有积水量的总和。
class Solution:def trap(self, height: List[int]) -> int:left = 0right = len(height) - 1left_max = 0right_max = 0water_set = 0while left < right:if height[left] < height[right]:if height[left] >= left_max:left_max = height[left]else:water_set += left_max - height[left]left += 1else:if height[right] >= right_max:right_max = height[right]else:water_set += right_max - height[right]right -= 1return water_set

x - height[left]
left += 1
else:
if height[right] >= right_max:
right_max = height[right]
else:
water_set += right_max - height[right]
right -= 1
return water_set


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

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

相关文章

Android——显式/隐式Intent

概述 在Android中&#xff0c;Intent是各个组件之间信息通信的桥梁&#xff0c;它用于Android各组件的通信。 Intent 的组成部分 一、显式 Intent 第一种方式 Intent intent new Intent(this, ActFinishActivity.class);startActivity(intent);第二种方式 Intent intent …

时序预测 | Matlab基于TSA-LSTM-Attention被囊群优化算法优化长短期记忆网络融合注意力机制多变量多步时间序列预测

时序预测 | Matlab基于TSA-LSTM-Attention多变量多步预测 目录 时序预测 | Matlab基于TSA-LSTM-Attention多变量多步预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 时序预测 | Matlab基于TSA-LSTM-Attention被囊群优化算法优化长短期记忆网络融合注意力机制多变量多…

PAT甲级-1041 Be Unique

题目 题目大意 从一组数字中选出第一个唯一出现的数&#xff0c;输出该数。如果没有&#xff0c;则输出None。 思路 哈希的思想&#xff0c;将数值作为索引&#xff0c;对应该数值出现的次数&#xff0c;然后遍历数组即可。 注意第一个数字是指数字的个数&#xff0c;不是数…

LLM 使用 Elastic 实现可观察性:Azure OpenAI (二)

作者&#xff1a;来自 Elastic Muthukumar Paramasivam•Lalit Satapathy 我们为 Azure OpenAI GA 包添加了更多功能&#xff0c;现在提供提示和响应监控、PTU 部署性能跟踪和计费洞察&#xff01; 我们最近宣布了 Azure OpenAI 集成的 GA。你可以在我们之前的博客 LLM 可观察性…

Python画图3个小案例之“一起看流星雨”、“爱心跳动”、“烟花绚丽”

源码如下&#xff1a; import turtle # 导入turtle库&#xff0c;用于图形绘制 import random # 导入random库&#xff0c;生成随机数 import math # 导入math库&#xff0c;进行数学计算turtle.setup(1.0, 1.0) # 设置窗口大小为屏幕大小 turtle.title("流星雨动画&…

二十九、Python基础语法(继承-上)

一、概念介绍 继承&#xff1a;继承描述的是类与类之间的关系&#xff0c;集成之后子类对象可以直接使用父类中定义的方法的属性&#xff0c;可以减少代码冗余&#xff0c;提高编码效率。 二、继承语法 三、继承例子 # 定义一个父类 Animal class Animal:def __init__(self,…

‌频率和波长之间存在反比关系‌

‌频率和波长之间存在反比关系‌。根据波速公式vλf&#xff0c;在同种介质中&#xff0c;波的传播速度相同&#xff0c;因此波长和频率的乘积不变&#xff0c;即λv/f。这意味着频率越高&#xff0c;波长越短&#xff1b;频率越低&#xff0c;波长越长。 ‌频率和波数的转换公…

Rust 力扣 - 238. 除自身以外数组的乘积

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 这题主要有个关键点&#xff0c;就是元素能取0&#xff0c;然后我们分类讨论元素为0的数量 如果数组中存在至少两个元素为0&#xff0c;则每个元素的除自身以外的乘积为0如果数组中仅存在一个0&#xff0c;则为…

我们来学mysql -- 连接(原理版)

我们来学mysql -- 连接 题记两张表驱动表 题记 回到初学者的视角&#xff0c;navicat或命令窗口&#xff0c;呈现一行行数据&#xff0c;类比为excel工作薄更是深入人心通过join将多表的记录关联起来&#xff0c;这似乎也没啥问题只是好像是那么回事&#xff0c;又…似乎有想说…

Ubuntu 22.04安装部署

一、部署环境 表 1‑1 环境服务版本号系统Ubuntu22.04 server lts运行环境1JDK1.8前端WEBNginx1.8数据库postgresqlpostgresql13postgis3.1pgrouting3.1消息队列rabbitmq3.X(3.0以上)运行环境2erlang23.3.3.1 二、安装系统 2.1安装 1.安装方式&#xff0c;选第一条。 2.选择…

红队-windows基础篇

声明 通过学习 泷羽sec的个人空间-泷羽sec个人主页-哔哩哔哩视频,做出的文章如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 一.Windows&linux介绍 微软windows操作系统&#xff0c;…

QT 从ttf文件中读取图标

最近在做项目时&#xff0c;遇到需要显示一些特殊字符的需求&#xff0c;这些特殊字符无法从键盘敲出来&#xff0c;于是乎&#xff0c;发现可以从字体库文件ttf中读取显示。 参考博客&#xff1a;QT 图标字体类IconHelper封装支持Font Awesome 5-CSDN博客 该博客封装的很不错…

AnaTraf | 探秘计算机网络:网络流量分析与 TCP 标志位解析

AnaTraf 网络性能监控系统NPM | 全流量回溯分析 | 网络故障排除工具AnaTraf网络流量分析仪是一款基于全流量&#xff0c;能够实时监控网络流量和历史流量回溯分析的网络性能监控与诊断系统&#xff08;NPMD&#xff09;。通过对网络各个关键节点的监测&#xff0c;收集网络性能…

瑞格智慧心理服务平台 NPreenSMSList.asmx SQL注入漏洞复现

0x01 产品简介 瑞格智慧心理服务平台是一家致力于提供个性化心理健康支持的平台。通过先进的AI技术和专业心理学家团队,为用户提供定制化的心理评估和个性化的心理咨询服务。平台注重隐私保护和数据安全,用户可以安全、便捷地接受在线咨询和心理指导,帮助他们理解和应对各种…

MATLAB口罩检测

在当今疫情严峻的背景下&#xff0c;口罩成为了人们必备的防护用品。然而&#xff0c;市面上却出现了大量假冒伪劣口罩。为了帮助大家准确辨别真假口罩&#xff0c;小编将为大家介绍一种基于MATLAB的口罩检测方法。 1.口罩检测原理 通过图像处理技术&#xff0c;借助MATLAB强大…

【刷题13】链表专题

目录 一、两数相加二、两两交换链表的节点三、重排链表四、合并k个升序链表五、k个一组翻转链表 一、两数相加 题目&#xff1a; 思路&#xff1a; 注意整数是逆序存储的&#xff0c;结果要按照题目的要求用链表连接起来遍历l1的cur1&#xff0c;遍历l2的cur2&#xff0c;和…

消息队列面试——打破沙锅问到底

消息队列的面试连环炮 前言 你用过消息队列么&#xff1f;说说你们项目里是怎么用消息队列的&#xff1f; 我们有一个订单系统&#xff0c;订单系统会每次下一个新订单的时候&#xff0c;就会发送一条消息到ActiveMQ里面去&#xff0c;后台有一个库存系统&#xff0c;负责获取…

Linux 下执行定时任务之 Systemd Timers

不知道 ECS 因为什么缘故&#xff0c;上面安装的 MySQL 服务老是不定期挂掉&#xff0c;本来想通过 Linux 得 Cron 配置个半小时的定时检测任务&#xff0c;结果一直没有执行&#xff0c;因此又尝试使用了 Systemd Timers 进行了重新配置&#xff0c;简要做个记录。 Systemd Ti…

yocto中如何来安装systemd服务

在 Yocto 项目中安装 systemd 服务可以按照以下步骤进行&#xff1a; 1. 创建服务单元文件&#xff08;.service 文件&#xff09; 在 Recipe 中处理&#xff1a;在 Yocto 中&#xff0c;为了将服务单元文件安装到目标系统&#xff0c;首先需要在软件包的 Recipe&#xff08;…

UE5相机系统初探(一)

UE5相机系统初探&#xff08;一&#xff09; 和Unity类似&#xff0c;UE的相机也是由名为Camera的component控制的。那么&#xff0c;在UE中要如何实现一个跟随玩家的第三人称相机呢&#xff1f;假设我们已经有了一个表示玩家的类ACF_Character&#xff0c;首先第一步就是要先在…