选择郑州网站建设,网站建设和推广,优品ppt官网网址,哪个网站可以做头像的目录 题目 leetcode 457
求解思路
代码
结果 题目 leetcode 457
存在一个不含 0 的 环形 数组 nums #xff0c;每个 nums[i] 都表示位于下标 i 的角色应该向前或向后移动的下标个数#xff1a;
如果 nums[i] 是正数#xff0c;向前#xff08;下标递增方向#xff0…目录 题目 leetcode 457
求解思路
代码
结果 题目 leetcode 457
存在一个不含 0 的 环形 数组 nums 每个 nums[i] 都表示位于下标 i 的角色应该向前或向后移动的下标个数
如果 nums[i] 是正数向前下标递增方向移动 |nums[i]| 步如果 nums[i] 是负数向后下标递减方向移动 |nums[i]| 步
因为数组是 环形 的所以可以假设从最后一个元素向前移动一步会到达第一个元素而第一个元素向后移动一步会到达最后一个元素。
数组中的 循环 由长度为 k 的下标序列 seq 标识
遵循上述移动规则将导致一组重复下标序列 seq[0] - seq[1] - ... - seq[k - 1] - seq[0] - ...所有 nums[seq[j]] 应当不是 全正 就是 全负k 1
如果 nums 中存在循环返回 true 否则返回 false 。
示例 1
输入nums [2,-1,1,2,2]
输出true
解释存在循环按下标 0 - 2 - 3 - 0 。循环长度为 3 。示例 2
输入nums [-1,2]
输出false
解释按下标 1 - 1 - 1 ... 的运动无法构成循环因为循环的长度为 1 。根据定义循环的长度必须大于 1 。示例 3:
输入nums [-2,1,-1,-2,-2]
输出false
解释按下标 1 - 2 - 1 - ... 的运动无法构成循环因为 nums[1] 是正数而 nums[2] 是负数。
所有 nums[seq[j]] 应当不是全正就是全负。提示
1 nums.length 5000-1000 nums[i] 1000nums[i] ! 0
求解思路
首先定义一个工具函数next_index求下一个索引值得注意的是python支持这种方法内部定义方法的方式
然后对每个下标起点进行遍历
如果nums[i] 为 0则代表这里会卡死要跳过
我们让fast指针快slow一步一个是方便后面的代码二个是加快执行效率让快指针更快追上慢指针得出是否存在循环
while作检测检查慢指针和当前快指针指向的数字也就是移动步数是否同号题目要求循环的路径要同号检查慢指针和快指针下一步位置是否同号
如果同号继续比较快慢指针现在是否相等如果相当还要检查慢指针下一步位置是不是自己题目要求路径长度至少为2如果不是自己才能return True
如果不相当则让快指针两步走慢指针一步走
直到while循环结束还没return结果执行下面的代码
接下来的代码是性能提升关键不加上的话只能击败9.52%的人
我需要重新让慢指针为i一切重新开始让慢指针一步步走一步步把它走过的地方变成0让以后再来到这里就知道这里没有结果
代码
class Solution(object):def circularArrayLoop(self, nums):def next_index(i):return (i nums[i]) % len(nums)for i in range(len(nums)):if nums[i] 0:continueslow, fast i, next_index(i)while nums[slow] * nums[fast] 0 and nums[slow] * nums[next_index(fast)] 0:if slow fast:if slow next_index(slow):breakreturn Trueslow next_index(slow)fast next_index(next_index(fast))# 性能提升slow i while nums[slow] * nums[next_index(slow)] 0:tmp slow slow next_index(slow)nums[tmp] 0return False
结果