leetcode - hot100 - python - 专题二:双指针

1、移动0 (一句话概括题眼:右指针找非0元素)

  • 简单

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:

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

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

  • 题解:
class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        n=len(nums)
        # 初始化左右指针
        l,r=0,0
        # 让 r指针 遍历数组,直到指向非0元素,将该元素移动到前面(交换元素),左指针往前移动,右指针继续移动直到遇到非0元素,重复操作
        while r<n:
            if nums[r]!=0:
                nums[r],nums[l]=nums[l],nums[r]
                l+=1
            r+=1

2、盛最多水的容器 (底高)

  • 中等

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

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

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

说明:你不能倾斜容器。
在这里插入图片描述

  • 题解
  • 左指针:开头,右指针:末尾
  • 容积——>长方形的面积——>底*高——>(左右指针的差值) * (短板:左右指针对应的高度的较小值)
class Solution:
    def maxArea(self, height: List[int]) -> int:
        # 初始化结果和左右指针
        res = 0
        l = 0
        r = len(height)-1
        # 只要左右指针不相遇就移动指针
        while l<r:
            # 表示底、高(高由“短板”决定)
            w = r-l
            h = min(height[l],height[r])
            res = max(res,h*w)
            # 更新左右指针
            # 左右指针在移动的时候,底在变小,因此移动方向,要让“短板”变长
            # 当右边高,就移动左指针
            if height[l] <= height[r]:
                l+=1
            else:
                r-=1
        return res

3、* 三数之和 (三指针)

  • 中等

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k
且 j != 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 。

注意: 答案中不可以包含重复的三元组(注意去重:三指针都要考虑去重)

  • 题解
  • 三指针:cur、left、right
  • 1、先 sort(数组),升序排列(特殊情况,第一个数就>0,它后面的就不需要花时间去看了)
  • 2、cur 遍历 数组,并且 left<right
  • 3、三数和 的情况有三种(>0,右指针左移)(<0左指针右移)(=0:注意要“去重”)
class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        # 三指针法
        # 初始化结果
        res =[]
        # 对 nums 进行排序
        nums.sort()
        # 初始化指针
        n = len(nums)
        cur = 0
        l = cur+1
        r = n-1
        
        # cur遍历nums
        for cur in range(n) :
            l = cur+1
            r = n-1
            # 排除特殊情况:
            if nums[cur]>0:
                return res
            # 对 cur 去重 nums[cur] 和nums[cur-1] 相等就跳出循环,注意:第一位不进行判断,因为它是在和最后一位进行比较,举例说明:[0,0,0,0] 返回[]
            if nums[cur] == nums[cur-1] and cur > 0:   
                continue
             # 更新l,r
            
           
            # 根据 total 的值来移动左右指针
            while l<r:
                # 计算 total
                total = nums[cur]+nums[l]+nums[r]
                # 1、如果 total>0 说明右边的值大了,要左移右指针
                if total>0: 
                    r-=1
                # 2、如果 total<0 说明左边的值小了,要右移左指针
                elif total <0: 
                    l+=1
                # 3、如果 total = 0 添加结果后,要进行内部的循环,对左指针,右指针对应的值进行去重
                else:
                    res.append([nums[cur],nums[l],nums[r]])
                    # 当左指针和下一个值相等,要移动左指针,直到左右指针相遇或者和下一个值不想等
                    while  l<r and nums[l] == nums[l+1]:
                        l+=1
                    while l<r and nums[r] == nums[r-1]:
                        r-=1 
                    l+=1
                    r-=1
      
            
        return res

4、接雨水

  • 困难

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

  • 题解
class Solution:
    def trap(self, height: List[int]) -> int:
        # 双指针法
        # 每个位置能接到的雨水量的和
        # 左边最大高度,右边最大高度,两者中的较小值-当前位置柱子的高度
        # 注意点:接到的雨水不能是负数,维护 MaxL,MaxR 

        # 初始化结果
        res = 0
        # 初始化左右指针
        l=0
        r=len(height)-1
        maxL = height[l]
        maxR = height[r]

        # 只要左右指针不相遇,就计算雨水量
        while l<r:
            # 因为雨水量由短板决定,因此应该先移动短板这边的方向
            if maxL < maxR:
                l+=1
                maxL = max(maxL,height[l])
                res += maxL-height[l]
            else:
                r-=1
                maxR = max(maxR,height[r])
                res += maxR-height[r]

        return res

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【玩转 Postman 接口测试与开发2_020】(完结篇)DIY 实战:随书示例 API 项目本地部署保姆级搭建教程(含完整调试过程)

《API Testing and Development with Postman》最新第二版封面 文章目录 最新版《Postman 接口测试与开发实战》示例 API 项目本地部署保姆级搭建教程1 前言2 准备工作3 具体部署3.1 将项目 Fork 到自己名下3.2 创建虚拟环境并安装依赖3.3 初始运行与项目调试 4 示例项目的用法…

【第五节】C++设计模式(创建型模式)-Prototype(原型)模式

目录 一、问题背景 二、 模式选择 三、讨论总结 一、问题背景 在软件开发中&#xff0c;有时我们需要通过已有对象来创建新对象&#xff0c;而不是从头开始构建。这种需求让我想起了现代制造业中的 3D 打印技术。通过扫描一个现有的物体&#xff0c;3D 打印机可以快速复制出…

next.js-学习2

next.js-学习2 1. https://nextjs.org/learn/dashboard-app/getting-started2. 模拟的数据3. 添加样式4. 字体&#xff0c;图片5. 创建布局和页面页面导航 1. https://nextjs.org/learn/dashboard-app/getting-started /app: Contains all the routes, components, and logic …

OpenCV计算摄影学(1)图像修复(Inpainting)的函数inpaint()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 使用图像中选定区域的邻域来恢复该选定区域。 cv::inpaint 函数是 OpenCV 中用于图像修复&#xff08;Inpainting&#xff09;的一个重要函数。它…

北京智和信通:全方位智能 OLT、ONU 设备监控运维方案

随着网络技术的不断迭代与发展&#xff0c;OLT作为光纤接入网中的核心设备&#xff0c;负责管理多个ONU&#xff0c;实现数据的传输和分配。其监控与运维的重要性愈发凸显&#xff0c;为了确保网络运行的高效与稳定&#xff0c;选择一套全面且高效的OLT、ONU监控运维方案显得尤…

python-leetcode-搜索二维矩阵 II

240. 搜索二维矩阵 II - 力扣&#xff08;LeetCode&#xff09; class Solution:def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:if not matrix or not matrix[0]:return Falsem, n len(matrix), len(matrix[0])i, j 0, n - 1 # 从右上角开始whi…

推送项目 之 解决冲突

文章目录 为什么会发生冲突&#xff1f;如何解决这些冲突&#xff1f;1. **查看冲突文件**2. **解决二进制文件冲突**3. **解决文本文件冲突**4. **标记冲突已解决**5. **完成合并**6. **推送更改** 注意事项总结 问题&#xff1a;我们在git pusll拉取远程仓库的代码到本地对比…

网页版的俄罗斯方块

1、新建一个txt文件 2、打开后将代码复制进去保存 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>俄…

Docker 部署 Jenkins持续集成(CI)工具

[TOC](Docker 部署 Jenkins持续集成(CI)工具) 前言 Jenkins 是一个流行的开源自动化工具&#xff0c;广泛应用于持续集成&#xff08;CI&#xff09;和持续交付&#xff08;CD&#xff09;的环境中。通过 Docker 部署 Jenkins&#xff0c;可以简化安装和配置过程&#xff0c;并…

LLM+多智能体协作:基于CrewAI与DeepSeek的邮件自动化实践

文章目录 引言理解 Flows&#xff08;工作流&#xff09;与 Crews&#xff08;协作组&#xff09;一、环境准备与工具安装1.1 Python环境搭建1.2 创建并激活虚拟环境1.3 安装核心依赖库&#xff08;crewai、litellm&#xff09; 二、本地DeepSeek R1大模型部署2.1 Ollama框架安…

[SQL] 事务的四大特性(ACID)

&#x1f384;事务的四大特性 以下就是事务的四大特性&#xff0c;简称ACID。 原子性&#x1f4e2;事务时不可分割的最小操作单元&#xff0c;要么全部成功&#xff0c;要么全部失败。一致性&#x1f4e2;事务完成后&#xff0c;必须使所有的数据都保持一致隔离性&#x1f4e2…

AI时代前端开发:自主学习能力的培养

在人工智能&#xff08;AI&#xff09;飞速发展的今天&#xff0c;技术迭代的速度如同脱缰的野马&#xff0c;对所有技术人员&#xff0c;特别是前端开发者&#xff0c;都提出了前所未有的挑战。新的框架、库、工具层出不穷&#xff0c;稍有松懈&#xff0c;就会被时代抛在身后…

【备赛】点亮LED

LED部分的原理图 led前面有锁存器&#xff0c;这是为了防止led会受到lcd的干扰&#xff08;lcd也需要用到这些引脚&#xff09;。 每次想要对led操作&#xff0c;就需要先打开锁存器&#xff0c;再执行操作&#xff0c;最后关闭锁存器。 这里需要注意的是&#xff0c;引脚配置…

Rocky8 源码安装 HAProxy

HAProxy 是一款开源的高性能 负载均衡器 和 反向代理 软件&#xff0c;专注于处理高并发流量分发&#xff0c;广泛应用于企业级架构中提升服务的可用性、扩展性和安全性。 一、HAProxy 简介 1.1.HAProxy 是什么&#xff1f; 本质&#xff1a; 基于 C 语言开发 的轻量级工具&a…

Javascript网页设计案例:通过PDFLib实现一款PDF分割工具,分割方式自定义-完整源代码,开箱即用

功能预览 一、工具简介 PDF 分割工具支持以下核心功能: 拖放或上传 PDF 文件:用户可以通过拖放或点击上传 PDF 文件。两种分割模式: 指定范围:用户可以指定起始页和结束页,提取特定范围的内容。固定间距:用户可以设置间隔页数(例如每 5 页分割一次),工具会自动完成分…

微信小程序调用火山方舟(字节跳动火山引擎)中的DeepSeek大模型

一、注册火山引擎账号&#xff0c;创建API Key和model&#xff08;接入点ID&#xff09; 1.注册并登陆火山引擎账号&#xff0c;网址为&#xff1a;https://console.volcengine.com/ 2.根据登陆后的页面提示进行实名认证&#xff0c;实名认证后才能创建API Keyt和创建接入点。…

Spring Boot 应用(官网文档解读)

Spring Boot 启动方式 SpringApplication.run(MyApplication.class, args); Spring Boot 故障分析器 在Spring Boot 项目启动发生错误的时候&#xff0c;我们通常可以看到上面的内容&#xff0c;即 APPLICATION FAILED TO START&#xff0c;以及后面的错误描述。这个功能是通过…

从单片机的启动说起一个单片机到点灯发生了什么下——使用GPIO点一个灯

目录 前言 HAL库对GPIO的抽象 核心分析&#xff1a;HAL_GPIO_Init 前言 我们终于到达了熟悉的地方&#xff0c;对GPIO的初始化。经过漫长的铺垫&#xff0c;我们终于历经千辛万苦&#xff0c;来到了这里。关于GPIO的八种模式等更加详细的细节&#xff0c;由于只是点个灯&am…

【JavaWeb学习Day19】

Tlias智能学习系统&#xff08;员工管理&#xff09; 删除员工&#xff1a; 需求分析&#xff1a; 其实&#xff0c;删除单条数据也是一种特殊的批量删除&#xff0c;所以&#xff0c;删除员工的功能&#xff0c;我们只需要开发一个接口就行了。 三层架构&#xff1a; Cont…

Windows 上源码安装 FastGPT

FastGPT 是一个强大的 AI RAG 平台&#xff0c;值得我们去学习了解。与常见的 Python 体系不同&#xff0c;Fast GPT 采用 Node.js/Next.js 平台&#xff08;对于广大 JS 开发者或前端开发者比较亲切友好&#xff09;&#xff0c;安装或部署比较简单。虽然一般情况下推荐简单的…