双指针算法【算法 18】

news2024/11/17 9:57:53

双指针算法

请添加图片描述

在算法设计与实现中,双指针算法是一种非常高效且常用的技术,尤其适用于处理数组和字符串相关的问题。通过维护两个指针(通常称为“快指针”和“慢指针”),双指针算法能够在对数组或字符串进行单次遍历的同时,完成元素的查找、替换、删除等操作,大大降低了时间复杂度。本文将介绍双指针算法的基本概念,并通过几个经典示例来展示其应用。

双指针算法的基本概念

双指针算法的核心思想是使用两个指针在数组或字符串上进行遍历,通过调整这两个指针的位置来解决问题。根据问题的不同,这两个指针可能同向移动(如快慢指针),也可能相向移动(如二分查找的变种),甚至可能一个指针固定,另一个指针移动。

经典示例:移除元素

问题描述:给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

示例

输入: nums = [3,2,2,3], val = 3  
输出: 2, nums = [2, 2]

双指针解法

def removeElement(nums, val):  
    # 初始化快慢指针  
    slow = 0  
    for fast in range(len(nums)):  
        # 当快指针指向的元素不等于val时,将其赋值给慢指针指向的位置  
        # 然后同时移动快慢指针  
        if nums[fast] != val:  
            nums[slow] = nums[fast]  
            slow += 1  
    # 慢指针的位置即为新数组的长度  
    return slow
经典示例:寻找重复的子字符串

问题描述:给定一个字符串 s,检查是否能重新排布其中的字母,使得它变成两个相同的子字符串的拼接。如果可以,返回 true;否则,返回 false

示例

输入: s = "aab"  
输出: true

双指针解法(这里先判断字符频率,然后检查是否可以平均分配):

def buddyStrings(s: str) -> bool:  
    if len(s) % 2 != 0:  
        return False  
      
    # 统计字符频率  
    freq = {}  
    for char in s:  
        freq[char] = freq.get(char, 0) + 1  
      
    # 检查是否有超过一半长度的字符出现奇数次  
    odd_count = 0  
    for count in freq.values():  
        if count % 2 != 0:  
            odd_count += 1  
        if odd_count > 1:  
            return False  
      
    # 如果所有字符都出现偶数次,检查字符串是否完全对称  
    mid = len(s) // 2  
    return odd_count == 0 and s[:mid] == s[mid:] or odd_count == 1 and len(set(s)) == len(freq) - 1  
  
# 注意:这个解法并不是纯粹的双指针,但展示了在处理字符串时的一些技巧  
# 纯粹的双指针解法可能需要根据具体问题进行设计,比如使用快慢指针来检查对称性
总结

双指针算法以其高效性和简洁性,在处理数组和字符串问题时展现出强大的能力。通过灵活应用双指针技术,我们可以解决许多看似复杂的问题。上述示例只是双指针算法应用的冰山一角,实际上,双指针算法的应用远不止于此,包括但不限于数组去重、寻找数组中的最大/最小子数组和、字符串匹配等。希望本文能够激发你对双指针算法的兴趣,并在未来的算法学习中加以应用。

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

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

相关文章

VSCode rust文件中的api点击无法跳转问题

如果配置了vscode的setting.json windows端的话 "settings": { "typescript.tsc.autoDetect": "off","rust-analyzer.linkedProjects": [".\\gui-btn\\Cargo.toml",".\\temp\\Cargo.toml", ],其他端类似 能不…

电脑怎么进行网页限制操作?

1、修改Hosts文件: 打开文件资源管理器,导航至C:\Windows\System32\drivers\etc\目录(注意,修改前最好备份原文件)。 找到并打开hosts文件,以管理员身份运行文本编辑器进行编辑。 在文件末尾添加一行&am…

基于Springboot投稿和稿件处理系统设计与实现

博主介绍:专注于Java vue .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用 感兴趣的…

Java | Leetcode Java题解之第441题排列硬币

题目: 题解: class Solution {public int arrangeCoins(int n) {return (int) ((Math.sqrt((long) 8 * n 1) - 1) / 2);} }

【STM32开发环境搭建】-2-安装STM32CubeMX

目录 1 下载STM32CubeMX 2 使用STM32CubeMX 2.1 设置Embedded software Package存放路径 2.2 下载并安装STM32的Embedded software Package 结尾 1 下载STM32CubeMX 注册一个ST的账号,单击STM32CubeMX - STM32Cube初始化代码生成器 - 意法半导体STMicroelectr…

《 C++ 修炼全景指南:十三 》为什么你的代码不够快?全面掌控 unordered_set 和 unordered_map 的哈希性能飙升魔法

摘要 本文深入探讨了 C 标准库中的两大无序容器——unordered_set 和 unordered_map,从底层实现、核心操作、性能优化、实际应用等多个方面进行了全面分析。首先,文章介绍了这两种容器的基本概念,说明了它们基于哈希表实现的特点&#xff0c…

AMD ROCm™ 安装指南

AMD ROCm™ installation — ROCm Blogs 注意: 本文之前是 AMD 实验笔记博客系列的一部分。 AMD ROCm™ 是第一个面向 HPC/超大规模级 GPU 计算的开源软件开发平台。AMD ROCm™ 将 UNIX 的选择权、极简主义和模块化软件开发哲学引入 GPU 计算领域。有关更多信息,请参…

华为OD机试 - 小明的幸运数(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,…

modelsim仿真出现的问题

问题:仿真波形没有结果 解决 点击Optimization Options 选第二个 右键testbench,Add Wave,快速添加 如何更改字体大小 Tools Edit Preference

latex设置背景颜色

\documentclass{article} \usepackage{xcolor} % 定义颜色,将#FCF9EA转换为LaTeX的颜色定义 \definecolor{mycolor}{HTML}{FCF9EA} % 设置页面颜色 \pagecolor{mycolor} \begin{document} This is a test page with the background color set to \# FCF9E…

如何巧妙运用Shell变量:掌握脚本编程的核心技巧

目录 前言一、Shell变量——变量类型1、用户自定义变量2、环境变量用./ 启动脚本文件记得加权限哦 二、Shell变量——变量赋值和访问(一)变量定义(二)变量的使用(三)删除变量(四)添加环境变量(五)内部变量(六&#xff…

Karmada新版本发布,支持联邦应用跨集群滚动升级

摘要:本次升级支持联邦应用跨集群滚动升级,使用户版本发布流程更加灵活可控;透明同事karmadactl 新增了多项运维能力,提供独特的多集群运维体验。 本文分享自华为云社区 《Karmada v1.11 版本发布!新增应用跨集群滚动升…

cve 漏洞排查流程

1、打开CVE连接 确认漏洞jar包以及版本信息 https://gitee.com/opengauss/security/issues/IASNOA?fromproject-issue 2、通过命令导出对应jar包的依赖树 并导出到目标结果文件中 mvn dependency:tree -Dincludes:gson > gson.result.txt 3、过滤test引用…

Linux之实战命令17:nl应用实例(五十一)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【…

成都睿明智科技有限公司抖音电商服务靠谱吗?

在这个电商风起云涌的时代,抖音作为短视频直播的超级流量池,正深刻改变着人们的购物习惯。无数商家蜂拥而至,渴望在这片蓝海中找到属于自己的岛屿。而提及抖音电商服务,成都睿明智科技有限公司无疑是一个备受瞩目的名字。那么&…

2024年7月大众点评餐饮比较北上广深成渝

在做一些城市分析、学术研究分析、商业选址、商业布局分析等数据分析挖掘时,大众点评的数据参考价值非常大,截至2024年7月,大众点评美食店铺剔除了暂停营业、停止营业后的最新数据情况分析如下。 分析研究的字段维度包括大众点评数字id、字母…

10分钟读懂,ITIL4为什么它是IT服务管理的未来?

点击进入ITIL资料库 在当今数字化时代,IT服务管理(ITSM)对于企业的重要性不言而喻。而作为ITSM领域最广泛采用的最佳实践框架,ITIL(Information Technology Infrastructure Library)一直在引领着行业的发展。2019年,AXELOS发布了ITIL 4&#…

突发:OpenAI o1颠覆了人类,o1为什么超越了人类,sam万字长文解读

要点速读 2024 年 9 月 12 日,OpenAI 发布了其最新的人工智能模型——o1(Learning to Reason with LLMs[1]),这是一款经过强化学习训练的大型语言模型,能够执行复杂的推理任务。相比于此前的 GPT-4o(GPT-4…

网络资源模板--Android Studio 宿舍管理系统

目录 一、项目演示 二、项目测试环境 三、项目详情 四、完整的项目源码 一、项目演示 网络资源模板--宿舍管理系统 二、项目测试环境 三、项目详情 登录注册页面 ### 功能总结 1. **用户输入**: - 允许用户输入用户名和密码。 2. **登录验证**: - 检查用户名和密码…

开启争对目标检测的100类数据集-信息收集

DataBall 助力快速掌握数据集的信息和使用方式。 目标检测项目数据集样例地址: gitcode: https://gitcode.com/DataBall/DataBall-detections-100s/overview github: https://github.com/TechLinkX/DataBall-detections-100s 请关注我们的专栏:DataBal…