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

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

示例 1:

输入:[2,-1,1,2,2]
输出:true
解释:存在循环,按索引 0 -> 2 -> 3 -> 0 。循环长度为 3 。

代码

class Solution {public boolean circularArrayLoop(int[] nums) {int n=nums.length;boolean[] flags=new boolean[n];Set<Integer> set=new HashSet<>();for(int i=0;i<n;i++)//检查正数{if(nums[i]<0||flags[i]) continue;set.add(i);int pre=i;while (true)//向后移动{int next=(pre+nums[pre])%n;if(nums[next]<0||next==pre||flags[next]){//因为路径是唯一的,所以路径上一旦有不满足的点,就整条路径标记起来,再也不用遍历这些点for(int c:set)flags[c]=true;set.clear();break;}if(set.contains(next)) return true;//可以产生环set.add(next);pre=next;//跳到下一点}}for(int i=0;i<n;i++)//检查负数{if(nums[i]>0||flags[i]) continue;set.add(i);int pre=i;while (true){int next=(pre+nums[pre])%n;next=next<0?next+n:next;if(nums[next]>0||next==pre||flags[next]){for(int c:set)flags[c]=true;set.clear();break;}if(set.contains(next)) return true;set.add(next);pre=next;}}return false;}
}

leetcode457. 环形数组循环相关推荐

  1. Java实现 LeetCode 457 环形数组循环

    457. 环形数组循环 给定一个含有正整数和负整数的环形数组 nums. 如果某个索引中的数 k 为正数,则向前移动 k 个索引.相反,如果是负数 (-k),则向后移动 k 个索引.因为数组是环形的, ...

  2. LeetCode 457. 环形数组循环(暴力+快慢指针)

    文章目录 1. 题目 2. 解题 2.1 暴力解题 2.2 快慢指针 1. 题目 给定一个含有正整数和负整数的环形数组 nums. 如果某个索引中的数 k 为正数,则向前移动 k 个索引.相反,如果是 ...

  3. [算法] 求环形数组中和值最大子段

    对于非环形数组,求解和值最大子段的方法见之前一遍文章: 对于环形数组,需要考虑最大和值子段越过首尾边界的情况,解决方法比较简单,即将数组处理两遍: 需要注意子段长度不可以超过整个数组长度: 1 #! ...

  4. 环形数组最大子数组之和

    题目:返回一个整数数组中最大子数组的和. 要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 如果数组A[0]--A[j-1]首尾相邻, ...

  5. 无锁数据结构--理解CAS、ABA、环形数组

    在分布式系统中经常会使用到共享内存,然后多个进程并行读写同一块共享内存,这样就会造成并发冲突的问题, 一般的常规做法是加锁,但是锁对性能的影响非常大. 无锁队列是一个非常经典的并行计算数据结构,它极大 ...

  6. 数组索引必须为正整数或逻辑值_LeeCode457-环形数组循环

    今天有些偷懒了 一天就做了两道算法题 英语没看 专业知识没复习 可能就得从上午的那篇论文被拒开始的吧 题目描述: 给定一个含有正整数和负整数的环形数组 nums. 如果某个索引中的数 k 为正数,则向 ...

  7. 环形数组求最大子数组之和

    环形数组求最大子数组之和: 实验要求: 随机产生一个整形数组,假设首尾相连为环形,求其相连的字数组的和,并输出子数组的元素. 设计思路: 因为是环形,所以要考虑自设的头尾的情况,在此分为两大类考虑,一 ...

  8. 《团队项目开发之三对一维环形数组的求解》

    <团队项目开发之三对一维环形数组的求解> 设计思想:通过把数组的长度扩大为原来的一倍,相当于新数组是由对原来的数组重复了一遍后而组成的,这样保证了数组以环状的形式,按照数组中每个数字的位序 ...

  9. vue 循环遍历list_vue使用map代替Aarry数组循环遍历的方法

    需求:根据主键id来找到对应的数组下标 原本的方法是使用for循环遍历该数组,变量 i 就是下标,问题在于,如果有多重for循环,就会导致性能大大下降,数据也容易出错 因此使用map,让数组(原本是l ...

最新文章

  1. 腾讯全力支持鸿蒙,腾讯宣布大力发展车联网,或与华为鸿蒙强强联合!
  2. 去一家小公司从0到1搭建后端架构,做个总结!
  3. 设计模式 — 行为型模式 — 模板方法模式
  4. OOP设计模式[JAVA]——03职责链模式
  5. 如何在Chatbot中应用深度学习
  6. open source project for recommendation system
  7. AUTOSAR从入门到精通100讲(六)-Multicore-多核存储优化
  8. 一篇文章教会你使用Python中三种简单的函
  9. 0010-伪类选择器-前端学习笔记
  10. Cadence导出带有书签和链接的PDF原理图
  11. Python入门教程!手把手教会你爬取网页数据
  12. 在Mac上将移动磁盘格式化为FAT32分区
  13. c语言有flag的程序,c语言flag(编程flag的用法)
  14. “科比男孩”被美国大学录取 即将出国圆梦
  15. UNI-APP_uni-app uni.getUserProfile微信授权,微信授权信息显示微信用户解决
  16. vue拍照功能PC+手机需要的可以看一下
  17. 如何用U盘启动做系统启动盘,如何重装系统
  18. http://www.dewen.net.cn/q/15749/PHP求数组值相加(可重复)等于某值的所有组合
  19. 从单片机到嵌入式开发——(6) 定时器与串口中断
  20. java实现图片jpg批量转换成pdf

热门文章

  1. 145. 二叉树的后序遍历
  2. JavaScript知识笔记(三)——内置对象、浏览器对象
  3. Java设计模式汇总
  4. jquery checkbox 实现单选
  5. AE 新建项目(一)(持续更新,做到哪算哪)
  6. 「网络流24题」试题库问题
  7. 第三周作业(一)单元测试
  8. XP下修改IIS连接数
  9. c/c++中const用法总结
  10. 图的四种最短路径算法