Leetcode457. 环形数组循环【C++】

题目:给定一组含有正整数和负整数的数组。如果某个索引中的 n 是正数的,则向前移动 n 个索引。相反,如果是负数(-n),则向后移动 n 个索引。

假设数组首尾相接。判断数组中是否有环。环中至少包含 2 个元素。环中的元素一律“向前”或者一律“向后”。

示例 1:给定数组 [2, -1, 1, 2, 2], 有一个循环,从索引 0 -> 2 -> 3 -> 0。

示例 2:给定数组[-1, 2], 没有循环。

注意:给定数组保证不包含元素"0"。

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


元旦休息两天回来热热手~~~

题意分析大致就是当遍历到nums数组某位置时,用当前位置下标再加上当前位置的数字得到下一个位置,如果能回到出发点则有循环,但是中间的数字必须都是全正数或者全负数,如果相加后得到的数字在数组之外则分正负情况取模得到循环的位置。

第一眼看想到的是再创建一个标志位vector,存储每个数字的访问情况,顺次往下进行循环,如果标志位表示数字已经访问过则用continue跳过,但是题目中要求空间复杂度为O(1)。

 

思考一下后想到题目中要求循环中的数字必须同号,那么可以利用这一特性按照上面题意分析中所说的进行遍历,并记录遍历开始时的头部位置,如果遍历回了头部则说明有循环,注意需要一个size变量记录当前循环长度,如果小于2也不是一个循环。 

但如果当前遍历到的数字异号,则表示之前记录的循环已经不能进行下去了

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值