初识算法 · 双指针(1)

目录

前言:

双指针算法

题目一:

​编辑

题目二:


前言:

本文作为算法部分的第一篇文章,自然是少不了简单叭叭两句,对于算法部分,多刷是少不了,我们刷题从暴力过度到算法解法,自然是一个很痛苦的过程,而算法本身的思考是很重要的,所以算法部分的介绍大多都是通过题目直接介绍,以题目来灌注算法知识,因为每人对于算法的接受程度有限,每篇大多都是两题左右,对于难题部分,大多时候只会出一道,并且均以leetcode作为题目来源,本文都会以最优质的解法来介绍不同的算法,通过三个部分来解决题目,题目解析,算法原理,算法编写。


双指针算法

题目一:

样例为:

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

题目解析:

给定一个数组,移动0到末尾,不必考虑0的相对顺序,但是要保持非零的相对顺序。

如果不使用双指针,有很多解法,比如我们可以将所有的非零元素移动到最开始,但是移动一次,就需要遍历一次,时间复杂度是接近于O(N^2)的,因为不能数组,这是一种暴力解法,那么我们如何使用双指针呢?

算法原理:

通过使用双指针,将数组划分为三个区域:

[0,dest]划分为非零元素的区域,[dest,cur]划分为0元素的区域,[cur,end]划分为还没有遍历的区域。既然是使用双指针算法,我们自然需要定义两个“指针”,可是这里实际上不是指针,这里我们需要对双指针有一个形象的认识,双指针并不是真正的用指针,它们代表的只是形象的指向两个元素而已,这里的指针可是是一个数,可以是数组,可以是任何能代替指向的东西。

这里是数组下标,所以定义两个下标是必不可少的。

然后就是进行划分区域,二者都是从0开始划分,dest我们不知道如何定义可以先不管,cur遍历数组,找到非零的元素,就给dest,那么怎么给呢?dest可以从-1开始,因为cur就是从0开始的,找到了非零元素,dest++进行交换,cur正常走即可。

算法编写:

class Solution {
public:void moveZeroes(vector<int>& nums) {for(int cur = 0,dest = -1;cur < nums.size();cur++){if(nums[cur])swap(nums[++dest],nums[cur]);}}
};

就过啦,可能算法代码出乎你想象的简单,习惯就好。

简单的分析一下时间复杂度吧,一次遍历,O(N),如果暴力是平方,这优化的就很不错了。

题目链接:283. 移动零 - 力扣(LeetCode)

题目二:

样例为:

输入:n = 19
输出:true
解释:
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1

题目解析:

题目名为快乐数,让我们看看题目有多快乐吧!

快乐数的定义为将一个数多次等于该数上的每一位数字的平方相加,如果经过多次变化,数字可以变为1,那么就是快乐数,但是如果是一直无线循环没有变成1,那么该数就不是快乐数。对于这种题目就没有暴力解法了,因为真要暴力的话很有可能套死循环出不去了。所以我们直接进入到算法原理部分。

算法原理:

我们不妨画图,看看变化是怎么个事儿:

对于19来说,经过了4次变化就到1,那么对于2来说,经过多次变化,出现了和第一次变化一样的值,4。

那么我们可不可以理解2在变化的时候出现了环,且数的变化出不了这个环,所以它不是快乐数,那么好像看起来也没啥啊,19也没有出现环,可是,如果我们换个角度,19变化的时候,是不是出现了一个环,环里面只有1呢?

这时候相信大部分人已经明了了,我们只需要判断环里面是不是1即可,即我们可以使用两个指针,一个走的快,一个走的慢,二者是一定相遇的,相遇的时候,看相遇的点是不是1就可以了。

那么就有第二个问题了,为什么一定会出现环呢?

这里要使用到的是我们之前未曾听闻的一个数学原理,鸽巢原理

我们使用鸽巢原理来证明一定会出现环状:

这是Leetcode中告诉的n最大的取值,那么:

这是最大的取值,我们不妨这样,一共有10个数字,我们再大一点,10个9,也就是说,我们计算一下9999999999经过一次变化之后的取值,变化之后的取值是810,也就是说,变化之后最大的值一定不会超过810。不妨定义函数F(x)等于一次变化,那么一个数经过811变化,也就是产生了811个数,但是总的区间只有810,那么一定有一个数是重复的,这就是鸽巢原理的应用。

算法编写:

class Solution 
{
public:int _isHappy(int num){int ans = 0,sum = 0;while(num){sum = num % 10;ans = ans + sum * sum;num /= 10;}return ans;}bool isHappy(int n) {int slow = n,fast = n;while(1){slow = _isHappy(slow);fast = _isHappy(_isHappy(fast));if(slow == fast){if(slow == 1)return true;elsereturn false;}}}
};

一个函数,_ishappy对应函数F(x),那么快慢指针,就是一个变化两次,一个变化一次,当它们相等的时候,判断即可,这里也应证了双指针的算法并不是真的使用指针,它更多的只是一种思想而已!!


今日算法到这里了,感谢阅读!

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

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

相关文章

【Linux】进程概念-2

文章目录 1.环境变量1.1 基本概念1.2 常见环境变量1.3 查看环境变量方法1.4 测试PATH1.5 测试HOME1.6 和环境变量相关的命令1.7 环境变量的组织方式1.8 通过代码如何获取环境变量1.9 通过系统调用获取或设置环境变量1.10 环境变量通常是具有全局属性的1.11 实验 2. 程序地址空间…

安全中心 (SOC) 与 网络运营中心 (NOC)

NOC 和 SOC 之间的区别 网络运营中心 (NOC) 负责维护公司计算机系统的技术基础设施&#xff0c;而安全运营中心 (SOC) 则负责保护组织免受网络威胁。 NOC 专注于防止自然灾害、停电和互联网中断等自然原因造成的网络干扰&#xff0c;而 SOC 则从事监控、管理和保护。 NOC 提…

微信小程序 图片的上传

错误示范 /*从相册中选择文件 微信小程序*/chooseImage(){wx.chooseMedia({count: 9,mediaType: [image],sourceType: [album],success(res) {wx.request({url:"发送的端口占位符",data:res.tempFiles[0].tempFilePath,method:POST,success(res){//请求成功后应该返…

Java在用增强for循环遍历集合时删除元素,抛出java.util.ConcurrentModificationException异常

文章目录 0. 前言1. 问题产生的背景2. Java中增强for循环的底层原理3. 为什么增强for循环不支持在遍历集合时删除元素3.1 问题排查3.2 modCount 变量的来源3.3 expectedModCount 变量的来源3.4 导致modCount变量和expectedModCount不相等的原因3.5 为什么用迭代器遍历元素时删除…

【Nacos架构 原理】内核设计之Nacos通信通道

文章目录 Nacos通信通道 &#xff08;长链接&#xff09;现状背景场景分析配置服务 长链接核心诉求功能性诉求负载均衡连接生命周期 Nacos通信通道 &#xff08;长链接&#xff09; 现状背景 Nacos 1.X 版本 Config/Naming 模块各自的推送通道都是按照自己的设计模型来实现的…

仪器数码管数字识别系统源码分享

仪器数码管数字识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comput…

Glide基本用法及With方法源码解析

文章目录 引入优点 使用步骤导入依赖权限使用 其他用法占位符错误图片后备回调符圆角过渡动画大小调整gif缩略图 使用RequestOptions缓存机制设置缓存策略清理缓存 使用集成库OkHttpVolley with源码解析getRetrieverGlide.getinitializeGlide getRequestManagerRetriever Reque…

【Spine】引入PhotoshopToSpine脚本

引入 右键Photoshop图标&#xff0c;选择属性 打开文件所在位置 找到目录下的\Presets\Scripts文件夹。 找到Spine目录下的\scripts\photoshop文件夹下的PhotoshopToSpine.jsx 复制它&#xff0c;丢到Photoshop刚才找的那个目录下。 使用 打开.psd文件&#xff0c;检查不要…

ubuntu 安装harbor

#安装包 wget https://github.com/goharbor/harbor/releases/download/v2.10.3/harbor-offline-installer-v2.10.3.tgz wget https://github.com/goharbor/harbor/releases/download/v2.10.3/harbor-offline-installer-v2.10.3.tgz.asc#导入签名公钥 gpg --keyserver hkps://ke…

文心一言 VS 讯飞星火 VS chatgpt (359)-- 算法导论24.3 1题

一、在图 24-2上运行Dijkstra算法&#xff0c;第一次使用结点 s s s作为源结点&#xff0c;第二次使用结点 z z z作为源结点。以类似于图 24-6 的风格&#xff0c;给出每次while循环后的 d d d值和 π π π值&#xff0c;以及集合 S S S中的所有结点。如果要写代码&#xff0c…

计算机毕业设计Spark+PyTorch股票预测系统 股票推荐系统 股票可视化 股票数据分析 量化交易系统 股票爬虫 股票K线图 大数据毕业设计 AI

《SparkPyTorch股票预测系统》开题报告 一、研究背景与意义 随着信息技术的飞速发展和全球金融市场的日益繁荣&#xff0c;股票投资已成为广大投资者的重要选择之一。然而&#xff0c;股票市场的复杂性和不确定性使得投资者在做出投资决策时面临巨大的挑战。传统的股票分析方…

Python空间地表联动贝叶斯地震风险计算模型

&#x1f3af;要点 使用贝叶斯推断模型兼顾路径和场地效应&#xff0c;量化传统地理统计曲线拟合技术。使用破裂和场地特征等地质信息以及事件间残差和事件内残差描述数学模型模型使用欧几里得距离度量、角距离度量和土壤差异性度量确定贝叶斯先验分布和后验分布参数&#xff…

CTMO时代下的营销新力量:2+1链动模式AI智能名片商城小程序

在当今这个瞬息万变的商业世界里&#xff0c;营销领域正经历着一场深刻的变革。传统的CMO岗位似乎在时代的浪潮中逐渐失去了它的光芒&#xff0c;CTMO正在悄然取代传统CMO的岗位。 随着营销丛林现象的出现&#xff0c;企业面临着前所未有的挑战。许多企业发现&#xff0c;那些传…

【SQL】未订购的客户

目录 语法 需求 示例 分析 代码 语法 SELECT columns FROM table1 LEFT JOIN table2 ON table1.common_field table2.common_field; LEFT JOIN&#xff08;或称为左外连接&#xff09;是SQL中的一种连接类型&#xff0c;它用于从两个或多个表中基于连接条件返回左表…

动态分配内存

目录 前言 一.malloc,free函数 1.malloc,free函数原型 2.使用方法 3.具体实例 4.注意事项 二.calloc函数 1.calloc函数原型 2.主要特点 3.使用案例 三.realloc函数 1.realloc函数原型 2.使用案例 3.注意事项 前言 动态内存是指在程序运行时&#xff0c;按需分配和…

51单片机学习第六课---B站UP主江协科技

DS18B20 1、基本知识讲解 2、DS18B20读取温度值 main.c #include<regx52.h> #include"delay.h" #include"LCD1602.h" #include"key.h" #include"DS18B20.h"float T; void main () {LCD_Init();LCD_ShowString(1,1,"temp…

时序必读论文14|VLDB24 TFB:全面且公平的时间序列预测方法框架

论文标题&#xff1a;TFB: Towards Comprehensive and Fair Benchmarking of Time Series Forecasting Methods 论文链接&#xff1a;https://arxiv.org/pdf/2403.20150.pdf 代码链接&#xff1a;https://github.com/decisionintelligence/TFB 前言 五一过后读的第一篇文章…

矩阵系统源码搭建的具体步骤,支持oem,源码搭建

一、前期准备 明确需求 确定矩阵系统的具体用途&#xff0c;例如是用于社交媒体管理、电商营销还是其他领域。梳理所需的功能模块&#xff0c;如多账号管理、内容发布、数据分析等。 技术选型 选择适合的编程语言&#xff0c;如 Python、Java、Node.js 等。确定数据库类型&…

计算机毕业设计 基于Python的广东旅游数据分析系统的设计与实现 Python+Django+Vue Python爬虫 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

Qt 中的 QListWidget、QTreeWidget 和 QTableWidget:简化的数据展示控件

Qt 中的 QListWidget、QTreeWidget 和 QTableWidget&#xff1a;简化的数据展示控件 在 Qt 的用户界面开发中&#xff0c;展示和管理数据是常见的需求。Qt 提供了丰富的控件供开发者选择&#xff0c;其中 QListWidget、QTreeWidget 和 QTableWidget 是三个高层封装控件&#x…