初识算法 · 双指针(1)

news2024/10/2 17:03:33

目录

前言:

双指针算法

题目一:

​编辑

题目二:


前言:

本文作为算法部分的第一篇文章,自然是少不了简单叭叭两句,对于算法部分,多刷是少不了,我们刷题从暴力过度到算法解法,自然是一个很痛苦的过程,而算法本身的思考是很重要的,所以算法部分的介绍大多都是通过题目直接介绍,以题目来灌注算法知识,因为每人对于算法的接受程度有限,每篇大多都是两题左右,对于难题部分,大多时候只会出一道,并且均以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;
                else
                return false;
            }
        }
    }
};

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


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

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

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

相关文章

csp-j模拟二补题报告

目录传送门 前言第一题下棋&#xff08;chess&#xff09;我的代码&#xff08;AC了&#xff09;AC代码 第二题汪洋&#xff08;BigWater&#xff09;我的代码&#xff08;0&#xff09;AC代码 第三题删数&#xff08;delnum&#xff09;我的代码&#xff08;0&#xff09;AC代…

秋招突击——9/13——携程提前准备和实际面经——专程飞过去线下,结果一面挂(难受)

文章目录 引言面经收集面经整理一1. ArrayList和LinkedList2. 线程安全的列表和链表有么&#xff1f;如果没有怎么实现&#xff1f;3. threadlocal4. synchronized锁升级过程及原理5. ReentrantLock原理&#xff0c;以及和synchronized的对比6. 线程池工作原理7. redis常用数据…

数据流和数据流处理技术

一数据流 首先明确数据流概念&#xff1a;数据流是连续不断生成的、快速变化的无界数据序列 数据流类型&#xff1a; 数据流大致可以分为四种类型 1.连续型数据流&#xff1a;不断地产生数据&#xff0c;数据稳定速度输入系统。 2.突发型数据流&#xff1a;在某特定时间或…

【吊打面试官系列-MySQL面试题】Mysql如何存储日期?

大家好&#xff0c;我是锋哥。今天分享关于【Mysql如何存储日期&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; Mysql如何存储日期&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Datatime:以 YYYY-MM-DD HH:MM:SS 格式存储时期时间&a…

基于Spring Boot+Unipp的中考体测训练小程序(协同过滤算法、图形化分析)【原创】

&#x1f388;系统亮点&#xff1a;协同过滤算法、图形化分析&#xff1b; 一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构&#xff1a;B/S架构 运行环境&#xff1a;win10/win11、jdk17 前端&#xff1a; 技术&#xff1a;框…

C++中stack和queue的模拟实现

目录 1.容器适配器 1.1什么是适配器 1.2STL标准库中stack和queue的底层结构 1.3deque的简单介绍 1.3.1deque的原理介绍 1.3.2deque的优点和缺陷 1.3.3deque和vector进行排序的性能对比 1.4为什么选择deque作为stack和queue的底层默认容器 2.stack的介绍和模拟…

c++-类和对象-点和圆关系

注意&#xff1a; 1.在一个类中可以让另一个类作为成员 2.可以把一个类拆成过个头文件&#xff0c;在.cpp中写成员函数实现&#xff0c;在头文件中留下类的声明和属性 实践 结果

我谈陷波滤波器

《数字图像处理&#xff08;电子信息前沿技术丛书&#xff09;》PP180~182勘误。 陷波滤波器在信号处理中就是带阻滤波器&#xff0c;信号处理中陷波滤波器不是这样定义的&#xff0c;二维比一维有这样的特殊性&#xff0c;我想这是Gonzalez创造的概念&#xff0c;在学术中借用…

初识算法 · 双指针(2)

目录 前言&#xff1a; 盛最多水的容器 题目解析&#xff1a; 算法原理&#xff1a; 算法编写&#xff1a; 有效三角形的个数 题目解析&#xff1a; 算法原理&#xff1a; 算法编写&#xff1a; 前言&#xff1a; 本文介绍两个题目&#xff0c;盛最多水的容器和有效三…

Excel下拉菜单制作及选项修改

Excel下拉菜单 1、下拉菜单制作2、下拉菜单修改 下拉框&#xff08;选项菜单&#xff09;是十分常见的功能。Excel支持下拉框制作&#xff0c;通过预设选项进行菜单选择&#xff0c;可以避免手动输入错误和重复工作&#xff0c;提升数据输入的准确性和效率 1、下拉菜单制作 步…

留存率的定义与SQL实现

1.什么是留存率 留存率是指在特定时间段内&#xff0c;仍然继续使用某项产品或服务的用户占用户总数的百分比。 通常&#xff0c;留存率会以日&#xff0c;周&#xff0c;或月为单位进行统计和分析。 2.SQL留存率常见问题 1.计算新用户登录的日期的次日留存率以及3日留存率 …

【鸿蒙学习】深入了解UIAbility组件

文章目录 组件概述生命周期启动模式基本用法 在鸿蒙操作系统&#xff08;HarmonyOS&#xff09;的开发过程中&#xff0c;UIAbility组件是构建应用界面的关键。本文将带您了解UIAbility组件的概述、生命周期、启动模式以及基本用法&#xff0c;并通过代码示例帮助您更好地掌握这…

微信互助学习平台|互助学习平台系统|基于java的微信互助学习平台设计与实现(源码+数据库+文档)

微信互助学习平台 目录 基于java的微信互助学习平台设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师…

论文阅读- On the Feasibility of Fully AI-automated Vishing Attacks

https://arxiv.org/pdf/2409.13793 目录 摘要 INTRODUCTION II. GOALS AND THREAT MODEL III. VIKING A. Architecture B. Interaction with the LLM C. Audio processing D. Call processing E. Implementation IV. EVALUATION METHODOLOGY A. Experiment design …

NeRF三维重建—神经辐射场

NeRF—神经辐射场 本文介绍了三维重建相关技术&#xff0c;特别是神经辐射场(NeRF)的进步&#xff0c;它通过深度学习实现逼真的三维场景重建。NeRF在计算机图形学、自动驾驶和元宇宙等领域展现出广阔的应用前景&#xff0c;通过改进传统方法&#xff0c;提供更高质量的渲染和沉…

聊聊国内首台重大技术装备(1)

9.9日&#xff0c;工信部发布了《首台&#xff08;套&#xff09;重大技术装备推广应用指导目录&#xff08;2024年版&#xff09;》&#xff0c;在集成电路领域&#xff0c;公布了如下首台机台设备&#xff0c;这确实是一个十分振奋人心的消息&#xff0c;说明我国在半导体制造…

LSTM模型实现光伏发电功率的预测

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有&#xff1a;中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等&#xff0c;曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝&#xff0c;拥有2篇国家级人工智能发明专利。 社区特色…

构造函数继承

构造函数继承 主要通过在子类的构造函数中调用父类的构造函数&#xff0c;绑定子类实例的 this&#xff0c;从而实现子类对父类属性的继承。这种方法避免了父类和子类共享原型链上的属性&#xff0c;并且可以传递参数给父类的构造函数。 构造函数继承的实现步骤&#xff1a; …

Windows远程Kylin系统-VNC

Windows远程Kylin系统-VNC 一. 配置 yum源 二. 清理yum缓存 三. 安装VNC并配置 nkvers yum install tigervnc tigervnc-server -ycp /lib/systemd/system/vncserver.service /etc/systemd/system/vncserver:1.service 说明&#xff1a;vncserver:1.service中的&#xff1a;1表…

Windows 环境下安装 Anaconda 并适配到 PowerShell 的保姆级教程

Anaconda Anaconda 是一个流行的 Python 数据科学和机器学习平台&#xff0c;它包括了 Conda 包管理器、Python 以及数百个用于科学计算的库和工具。Anaconda 旨在简化包和环境管理&#xff0c;使得安装、更新和管理软件包变得容易&#xff0c;同时也能够轻松创建和切换不同的P…