Leetcode Hot100之双指针

1. 移动零

  • 题目描述
    给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
    请注意 ,必须在不复制数组的情况下原地对数组进行操作。
  • 解题思路
    双指针遍历一遍即可解决:
    1. 我们定义了两个指针 i 和 j,它们都初始化为 0。然后,我们开始遍历列表。j 指针用于遍历整个列表,而 i 指针用于跟踪下一个非零元素应该放置的位置。
    2. 在第一遍循环结束后,所有非零元素都已经按原始顺序排列在列表的前面。在第二遍循环中,我们将列表中剩余的所有位置都赋值为 0。
    3. 时间复杂度: O(n) 空间复杂度: O(1)
  • 代码
    class Solution:def moveZeroes(self, nums: List[int]) -> None:"""Do not return anything, modify nums in-place instead."""n = len(nums)if n == 0:returni = j = 0while j < n:if nums[j] != 0:nums[i] = nums[j]i += 1j += 1while i < n:nums[i] = 0i += 1
    

2. 盛最多水的容器

  • 题目描述
    给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。
    说明:你不能倾斜容器。
    在这里插入图片描述

  • 解题思路

    1. 我们初始化两个指针 l 和 r,分别指向数组的开始和结束位置,当前水容量是(r - l) * min(heights[l], heights[r]);
    2. 我们每次移动高度较小的指针,因为移动高度较大的指针不会增加水容量,只会减少水容量;比如如果heights[l] 较小,那么无论 r 指针如何移动,都不可能得到更大的水容量,因此我们选择移动 l 指针。
    3. 时间复杂度:O(n) 空间复杂度:O(1)
  • 代码

    class Solution:def maxArea(self, height: List[int]) -> int:n = len(height)if n == 0:return 0l, r = 0, n - 1res = 0while l < r:res = max(res, (r - l) * min(height[l], height[r]))if height[l] < height[r]:l += 1else:r -= 1return res
    

3. 三数之和

  • 题目描述
    给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

    你返回所有和为 0 且不重复的三元组。

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

  • 解题思路

    1. 求解两数之和可以使用双指针,但此时需要先对数组进行排序,然后使用双指针分别指向数组的头部和尾部,然后根据两个指针指向的元素之和与目标值的大小关系来移动指针。
    2. 那么3数之和就可以在外面加上一层循环,循环内部使用双指针求两数之和等于traget - nums[i]。
    3. 在此过程中注意去重,包括外循环的去重和内循环的去重,如果当前元素和前一个元素相同,那么直接跳过。
    4. 时间复杂度:O(n^2) 空间复杂度:O(1)
  • 代码

    class Solution:def threeSum(self, nums: List[int]) -> List[List[int]]:n = len(nums)if n < 3:return []nums.sort()res = []for i in range(n-2):if i > 0 and nums[i] == nums[i - 1]:continuel, r = i + 1, n - 1while l < r:if nums[l] + nums[r] == 0 - nums[i]:res.append([nums[i], nums[l], nums[r]])l += 1r -= 1while l < r and nums[l] == nums[l - 1]:l += 1while l < r and nums[r] == nums[r + 1]:r -= 1elif nums[l] + nums[r] > 0 - nums[i]:r -= 1else:l += 1return res
    

4. 接雨水

  • 题目描述
    给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
    在这里插入图片描述

  • 解题思路

    1. 总的接雨水量等于每个柱子上的接雨水量之和,每个柱子上的接雨水量等于左边最高柱子和右边最高柱子中较小的那个减去当前柱子的高度。
    2. 因此通过动态规划可以求解左边最高柱子和右边最高柱子,然后求解每个柱子上的接雨水量。
    3. 时间复杂度:O(n) 空间复杂度:O(n)
  • 代码

    class Solution:def trap(self, height: List[int]) -> int:n = len(height)if n < 3:return 0left_max = [0] * nright_max = [0] * nfor i in range(1, n):left_max[i] = max(left_max[i - 1], height[i - 1])for i in range(n - 2, -1, -1):right_max[i] = max(right_max[i + 1], height[i + 1])res = 0for i in range(n):if min(left_max[i], right_max[i]) > height[i]:res += min(left_max[i], right_max[i]) - height[i]return res
    

5. 总结

双指针在以下场景可以发挥作用:1. 原地对数组进行一些数据交换的操作,比如移动零、翻转数组、旋转数组等操作;2. 排序数组中求两数的目标和,比如三数之和题目;3.序列搜索中,从left = 0和right = n-1分别出发,可通过一定的规律先后移动left和right,最后再O(n)时间内完成搜索。

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

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

相关文章

C++ Windows Hook使用

GitHub - microsoft/Detours: Detours is a software package for monitoring and instrumenting API calls on Windows. It is distributed in source code form. /*挂载钩子 setdll /d:C:\Users\g\source\repos\LotTest\Release\lotDll.dll C:\Users\g\source\repos\LotTest…

Java特性之设计模式【访问者模式】

一、访问者模式 概述 在访问者模式&#xff08;Visitor Pattern&#xff09;中&#xff0c;我们使用了一个访问者类&#xff0c;它改变了元素类的执行算法。通过这种方式&#xff0c;元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式&…

WPF三方UI库全局应用MessageBox样式(.NET6版本)

一、问题场景 使用HandyControl简写HC 作为基础UI组件库时&#xff0c;希望系统中所有的MessageBox 样式都使用HC的MessageBox&#xff0c;常规操作如下&#xff1a; 在对应的xxxx.cs 顶部使用using 指定特定类的命名空间。 using MessageBox HandyControl.Controls.Message…

js语法---理解反射Reflect对象和代理Proxy对象

Reflect 基本要点 反射&#xff1a;reflect是一个内置的全局对象&#xff0c;它的作用就是提供了一些对象实例的拦截方法&#xff0c;它的用法和Math对象相似&#xff0c;都只有静态方法和属性&#xff0c;同时reflect也没有构造器&#xff0c;无法通过new运算符构建实例对象&…

xcode和iPhone真机或者watch真机连接问题

1.如果真机是第一次连接xocde&#xff0c;就需要开启真机上的开发者模式&#xff0c;开启开发者模式的方式&#xff1a; iphone/ipad开启方式: 设置 > 隐私与安全 > 开发者模式 > 开启&#xff0c;然后重启就可以了 watch设置&#xff1a;很麻烦&#xff0c;看文章…

数据库异常数据恢复(1)-快速恢复和镜像恢复

(一) 数据库服务器的崩溃和恢复 1. 服务器的修复机制 数据库因为某些原因导致数据库突然异常donw机&#xff0c;为了保证数据库的使用&#xff0c;提供了一些机制进行数据库的恢复 快速恢复&#xff1a;数据库异常down机后重启数据库自己的恢复方式&#xff0c;人工无法干预…

现代谱估计分析信号的功率谱(1)---AR 模型谱估计

本篇文章是博主在通信等领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对通信等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在通信领域笔记&#xff1a;…

Spring相关面试题(一)

Spring 1.谈谈你对Spring的理解 难度系数 Spring 是一个开源框架&#xff0c;为简化企业级应用开发而生。Spring 可以是使简单的JavaBean 实现以前只有EJB 才能实现的功能。Spring 是一个 IOC 和 AOP 容器框架。 Spring 容器的主要核心是&#xff1a; 控制反转&#xff08;…

进阶篇06——锁

概述 全局锁 表级锁 表锁 元数据锁 元数据锁是系统自动加的&#xff0c;不需要我们手动执行命令添加。 意向锁 意向锁和元数据锁一样&#xff0c;也是在加行锁的时候自动给表加上相应的意向锁&#xff0c;不需要我们手动添加。 行级锁 行锁 读锁和读锁兼容&#xff0c;写锁…

易舟云财务软件:开启云记账新时代

在数字化浪潮的推动下&#xff0c;财务管理正经历着深刻的变革。易舟云财务软件&#xff0c;作为一款引领时代的云记账平台&#xff0c;以其卓越的功能和便捷的操作&#xff0c;为企业带来了全新的财务管理体验。 云记账&#xff0c;财务管理的未来趋势 云记账&#xff0c;即基…

免费试用【汇通动态域名】体验test.htdns.cn

汇通动态域名下载地址&#xff1a; http://www.htsoft.com.cn/htsoft/htdnssoft.html 下载后汇通动态域名是绿色软件&#xff0c;不用安装&#xff0c;直接运行htdns.exe 点注册 二级域名地方改成您自己要的域名&#xff0c;我输入的是test,点保存&#xff0c;提示让您输入密…

2024年618成交额达7428亿 淘宝京东618交易额数据对比排名

2024年618年中大促已经基本落下帷幕&#xff0c;作为上半年最重要的电商节日&#xff0c;今年的618交易额有多少&#xff1f;今年的交易数据有哪些变化&#xff1f;我们来一起看一下&#xff01; 根据星图监测数据显示&#xff0c;2024年618期间&#xff08;天猫5月20日20: 00-…

Python 中的 Pandas(数据分析与处理)

Pandas 是 Python 中最受欢迎的数据处理库之一&#xff0c;其名字源自于“Panel Data”&#xff08;面板数据&#xff09;的缩写。它提供了三种主要的数据结构&#xff1a;Series &#xff0c; DataFrame &#xff0c; Panel&#xff08;在新版本已经被弃用&#xff09; 数…

海外盲盒APP开发,盲盒出海热!

当下&#xff0c;盲盒作为一种热门的娱乐休闲模式&#xff0c;在全球消费市场中都非常火热&#xff0c;各种热门盲盒商品刚一上线就受到了秒杀&#xff0c;受到了各地年轻消费者的追捧&#xff01; 盲盒全球化对于我国盲盒企业来说是一个新的机会&#xff0c;有助于我国盲盒快…

华为云下Ubuntu20.04中Docker的部署

我想用Docker拉取splash&#xff0c;Docker目前已经无法使用&#xff08;镜像都在国外&#xff09;。这导致了 docker pull 命令的失败&#xff0c;原因是timeout。所以我们有必要将docker的源设置在国内&#xff0c;直接用国内的镜像。 1.在华为云下的Ubuntu20.04因为源的原因…

uniapp+unocss报错Error [ERR_REQUIRE_ESM]: require() of ES Module

uniappvue3使用unocss报错 vite.config.ts代码&#xff1a; import { defineConfig } from "vite"; import uni from "dcloudio/vite-plugin-uni"; import AutoImport from "unplugin-auto-import/vite"; import Unocss from unocss/vite;expo…

Python 基础:文件

目录 一、从文件中读取数据1.1 读取整个文件1.2 逐行读取 二、写入文件2.1 写入空文件2.2 写入多行2.3 附加到文件 遇到看不明白的地方&#xff0c;欢迎在评论中留言呐&#xff0c;一起讨论&#xff0c;一起进步&#xff01; 本文参考&#xff1a;《Python编程&#xff1a;从入…

java-Object 底层实现

### 4. Object类的底层实现 #### 4.1 内存布局 在Java虚拟机中&#xff0c;每个对象都有一个头部&#xff08;Header&#xff09;&#xff0c;包含对象的元数据和同步信息。对象头部包括两个主要部分&#xff1a; - **Mark Word**&#xff1a;用于存储对象的哈希码、GC年龄、…

[modern c++] 类型萃取 type_traits

前言&#xff1a; #include <type_traits> type_traits 又叫类型萃取&#xff0c;是一个在编译阶段用于进行 类型判断/类型变更 的库&#xff0c;在c11中引入。因为其工作阶段是在编译阶段&#xff0c;因此被大量应用在模板编程中&#xff0c;同时也可以结合 constexpr…

如何理解shell命令 cd $(dirname $0)

理解命令 cd $(dirname $0) 需要逐步拆解和分析每个部分的功能&#xff1a; $0&#xff1a; 在shell脚本中&#xff0c;$0 代表脚本的名称。这个变量包含了脚本的完整路径或相对路径。 dirname $0&#xff1a; dirname 是一个命令&#xff0c;用于去掉路径中的文件名部分&…