457. 环形数组循环

题目描述

给定一个含有正整数和负整数的环形数组 nums。 如果某个索引中的数 k 为正数,则向前移动 k 个索引。相反,如果是负数 (-k),则向后移动 k 个索引。因为数组是环形的,所以可以假设最后一个元素的下一个元素是第一个元素,而第一个元素的前一个元素是最后一个元素。

确定 nums 中是否存在循环(或周期)。循环必须在相同的索引处开始和结束并且循环长度 > 1。此外,一个循环中的所有运动都必须沿着同一方向进行。换句话说,一个循环中不能同时包括向前的运动和向后的运动。

示例 1:

输入:[2,-1,1,2,2]

输出:true

解释:存在循环,按索引 0 -> 2 -> 3 -> 0 。循环长度为 3 。

示例 2:

输入:[-1,2]

输出:false

解释:按索引 1 -> 1 -> 1 … 的运动无法构成循环,因为循环的长度为 1 。根据定义,循环的长度必须大于 1 。

示例 3:

输入:[-2,1,-1,-2,-2]

输出:false

解释:按索引 1 -> 2 -> 1 -> … 的运动无法构成循环,因为按索引 1 -> 2 的运动是向前的运动,而按索引 2 -> 1
的运动是向后的运动。一个循环中的所有运动都必须沿着同一方向进行。

提示:

  • -1000 ≤ nums[i] ≤ 1000
  • nums[i] ≠ 0
  • 0 ≤ nums.length ≤ 5000

进阶:

  • 你能写出时间时间复杂度为 O(n) 和额外空间复杂度为 O(1) 的算法吗?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/circular-array-loop
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

运用快慢指针。
当遇到无环的情况时,把 i 结点到当前结点的所有结点都置为0,这成为我们判断结点是否在环内的条件。
判断无环的依据:

  1. 符号相反
  2. 结点不在环内,nums[i] == 0
  3. 前后结点相等,即循环长度=1
class Solution {
   
    public boolean circularArrayLoop(int[] nums) {
   
        int n = nums.length;
        for(int i = 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32是一款功能强大的微控制器系列,具有广泛的应用领域。环形数组是一种特殊的数组形式,具有循环存储数据的特点。 在STM32中使用环形数组可以实现高效的数据存储和处理。环形数组的特点是数组尾和数组头相互连接,形成一个闭环。当数据写入到环形数组中时,如果数组尾已经到达数组的最大容量,则数据将被写入到数组头的位置,实现循环存储。这样一来,可以不断地写入新的数据,而不需要重新分配内存空间。 使用环形数组的好处主要有两点。首先,可以节省内存空间,因为环形数组不需要重新分配内存空间,只需要维护一个固定大小的数组即可。其次,对于一些需要连续不断地写入数据的应用场景,环形数组有着更高的效率。比如在实时数据采集中,传感器数据可以不断地写入环形数组,而不需要停顿等待内存分配操作。 在STM32中实现环形数组的关键是要正确处理数组索引。通常情况下,需要使用两个索引来表示数组的头和尾。当写入数据时,更新尾索引并将数据写入到尾部位置;如果尾索引到达数组的最大容量,则将尾索引重置为0。当读取数据时,更新头索引,并返回头位置处的数据;如果头索引到达数组的最大容量,则将头索引重置为0。 通过合理地管理数组索引,使用环形数组可以有效地实现数据的循环存储和访问。这在STM32的许多应用中都有着重要的作用,比如传感器数据采集、循环缓存、循环队列等。因此,了解和应用环形数组对于STM32开发者来说非常重要。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值