【快慢指针】283.移动零

本文介绍了一种使用快慢指针的算法,用于解决将数组中的零值移动到末尾的问题,不改变非零元素的相对顺序,是基础数据结构和算法中的经典案例。

题目

法1:快慢指针

Python

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        n = len(nums)
        slow =  fast = 0
        while fast < n:
            if nums[fast] != 0:
                nums[slow] = nums[fast]
                slow += 1
            fast += 1
        
        while slow < n:
            nums[slow] = 0
            slow += 1

Java

必须掌握,基础算法!!!

class Solution {
    public void moveZeroes(int[] nums) {
        int slow = -1, fast = 0;
        while (fast < nums.length) {
            if (nums[fast] != 0) {
                nums[++slow] = nums[fast++];
            } else {
                fast++;
            }
        }

        while (slow + 1 < nums.length) {
            nums[++slow] = 0;
        }
    }
}
提供了基于BP(Back Propagation)神经网络结合PID(比例-积分-微分)控制策略的Simulink仿真模型。该模型旨在实现对杨艺所著论文《基于S函数的BP神经网络PID控制器及Simulink仿真》中的理论进行实践验证。在Matlab 2016b环境下开发,经过测试,确保能够正常运行,适合学习和研究神经网络在控制系统中的应用。 特点 集成BP神经网络:模型中集成了BP神经网络用于提升PID控制器的性能,使之能更好地适应复杂控制环境。 PID控制优化:利用神经网络的自学习能力,对传统的PID控制算法进行了智能调整,提高控制精度和稳定性。 S函数应用:展示了如何在Simulink中通过S函数嵌入MATLAB代码,实现BP神经网络的定制化逻辑。 兼容性说明:虽然开发于Matlab 2016b,但理论上兼容后续版本,可能会需要调整少量配置以适配不同版本的Matlab。 使用指南 环境要求:确保你的电脑上安装有Matlab 2016b或更高版本。 模型加载: 下载本仓库到本地。 在Matlab中打开.slx文件。 运行仿真: 调整模型参数前,请先熟悉各模块功能和输入输出设置。 运行整个模型,观察控制效果。 参数调整: 用户可以自由调节神经网络的层数、节点数以及PID控制器的参数,探索不同的控制性能。 学习和修改: 通过阅读模型中的注释和查阅相关文献,加深对BP神经网络与PID控制结合的理解。 如需修改S函数内的MATLAB代码,建议有一定的MATLAB编程基础。
### 快慢指针算法概述 快慢指针是一种常见的双指针技术,通过设置两个不同速度的指针在一维数据结构(如数组或链表)上移动来解决问题。通常情况下,快指针每次向前移动两步或多步,而慢指针每次只前进一步[^2]。 #### 快慢指针的核心思想 核心在于利用两者之间的相对速度差异,从而达到特定的目标位置或者检测某些特性。例如,在处理单向链表时,可以通过这种方式轻松定位到中间节点、判断是否存在环以及查找环的入口等[^3]。 --- ### 快慢指针的应用场景及其实现 #### 应用场景 1:寻找链表的中间节点 为了找到链表的中间节点,可以让快指针一次前进两步,慢指针一次前进一步。当快指针到达链表末端时,慢指针正好位于链表的中间位置。 ```python def find_middle_node(head): slow, fast = head, head while fast and fast.next: slow = slow.next # 慢指针走一步 fast = fast.next.next # 快指针走两步 return slow # 返回中间节点 ``` --- #### 应用场景 2:判断链表是否有环 如果链表中存在环,则快指针最终会追上慢指针;反之则不存在环。此逻辑基于快慢指针的速度差使得它们能够在有限时间内相遇[^4]。 ```python def has_cycle(head): slow, fast = head, head while fast and fast.next: slow = slow.next # 慢指针走一步 fast = fast.next.next # 快指针走两步 if slow == fast: # 如果相遇说明有环 return True return False # 否则无环 ``` --- #### 应用场景 3:找出环的入口节点 假设链表中有环,那么可以先让快慢指针分别从头结点出发直到第一次相遇。接着重置其中一个指针回到头部,并使二者均以相同速率逐步前行直至再度交汇处即为环起点。 ```python def detect_cycle_entry(head): slow, fast = head, head # 判断是否存在环 while fast and fast.next: slow = slow.next fast = fast.next.next if slow == fast: break # 首次相遇 if not (fast and fast.next): # 若未形成闭环返回None return None # 找到环入口 slow = head # 将慢指针移回起始位置 while slow != fast: # 当二者的距离等于0时表示找到了入环点 slow = slow.next fast = fast.next return slow # 返回环入口节点 ``` --- ### 总结 快慢指针作为一种高效且简洁的技术手段广泛应用于各种复杂度较高的问题之中,诸如上述提到过的获取列表中心项、检验循环状况乃至确定具体进入路径等方面都发挥着不可替代的重要作用[^1]. ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值