457. 环形数组是否存在循环

457. 环形数组是否存在循环

  • 原题链接:
  • 完成情况:
  • 解题思路:
  • 参考代码:
  • 经验吸取

原题链接:

457. 环形数组是否存在循环

https://leetcode.cn/problems/circular-array-loop/description/

完成情况:

在这里插入图片描述

解题思路:

	/**怎么实现数组循环?     -> 取模移动怎么判断是否能构成循环?   -> 快慢指针-1、我们可以将环形数组理解为图中的 n个点,nums[i] 表示 i号点向 (i+nums[i]) mod n号点连有一条单向边。-2、注意到这张图中的每个点有且仅有一条出边,这样我们从某一个点出发,沿着单向边不断移动,最终必然会进入一个环中。而依据题目要求,我们要检查图中是否存在一个所有单向边方向一致的环。我们可以使用在无向图中找环的一个经典算法:快慢指针。-3、具体地,我们检查每一个节点,令快慢指针从当前点出发,快指针每次移动两步,慢指针每次移动一步,期间每移动一次,我们都需要检查当前单向边的方向是否与初始方向是否一致,如果不一致,我们即可停止遍历,因为当前路径必然不满足条件。为了降低时间复杂度,我们可以标记每一个点是否访问过,过程中如果我们的下一个节点为已经访问过的节点,则可以停止遍历。-4、在实际代码中,我们无需新建一个数组记录每个点的访问情况,而只需要将原数组的对应元素置零即可(题目保证原数组中元素不为零)。遍历过程中,如果快慢指针相遇,或者移动方向改变,那么我们就停止遍历,并将快慢指针经过的点均置零即可。-5、特别地,当 nums[i]为 n 的整倍数时,i的后继节点即为 i 本身,此时循环长度 k=1,不符合题目要求,因此我们需要跳过这种情况。*/

参考代码:

package 西湖算法题解___中等题;public class __457环形数组是否存在循环 {/*题目翻译:就是说,有一个数组,可以认为是形成了环的数组里面的元素,【正数】代表向前移动多少个,【负数】代表向后退多少个问?!其中是否存在部分子数组能构成一个循环移动保持不变顺序的数组*/public boolean circularArrayLoop(int[] nums) {/**怎么实现数组循环?     -> 取模移动怎么判断是否能构成循环?   -> 快慢指针-1、我们可以将环形数组理解为图中的 n个点,nums[i] 表示 i号点向 (i+nums[i]) mod n号点连有一条单向边。-2、注意到这张图中的每个点有且仅有一条出边,这样我们从某一个点出发,沿着单向边不断移动,最终必然会进入一个环中。而依据题目要求,我们要检查图中是否存在一个所有单向边方向一致的环。我们可以使用在无向图中找环的一个经典算法:快慢指针。-3、具体地,我们检查每一个节点,令快慢指针从当前点出发,快指针每次移动两步,慢指针每次移动一步,期间每移动一次,我们都需要检查当前单向边的方向是否与初始方向是否一致,如果不一致,我们即可停止遍历,因为当前路径必然不满足条件。为了降低时间复杂度,我们可以标记每一个点是否访问过,过程中如果我们的下一个节点为已经访问过的节点,则可以停止遍历。-4、在实际代码中,我们无需新建一个数组记录每个点的访问情况,而只需要将原数组的对应元素置零即可(题目保证原数组中元素不为零)。遍历过程中,如果快慢指针相遇,或者移动方向改变,那么我们就停止遍历,并将快慢指针经过的点均置零即可。-5、特别地,当 nums[i]为 n 的整倍数时,i的后继节点即为 i 本身,此时循环长度 k=1,不符合题目要求,因此我们需要跳过这种情况。*/int nLength = nums.length;for (int i=0;i<nLength;i++){if (nums[i] == 0){continue;}int slowP = i,fastP = cirNext(nums,i);//判断非零且方向要求相同while (nums[slowP] * nums[fastP] > 0  && nums[slowP] * nums[cirNext(nums,fastP)] > 0){if (slowP == fastP){if (slowP != cirNext(nums,slowP)){return true;}else {break;}}slowP = cirNext(nums,slowP);fastP = cirNext(nums,cirNext(nums,fastP));}int add = i;while (nums[add] * nums[cirNext(nums,add)] > 0){int temp = add;add = cirNext(nums,add);nums[temp] = 0;}}return false;}/*** 模拟数组循环,即对数值进行取模判断** @param nums* @param curP* @return*/private int cirNext(int[] nums, int curP) {int nLength = nums.length;return ((curP + nums[curP]) % nLength + nLength)%nLength;}
}

经验吸取

数组循环判断 -> 快慢指针

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/67572.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

undefined reference to `dlopen‘ ‘SSL_library_init‘ `X509_certificate_type‘

使用Crow的时候需要注意crow依赖asio依赖OpenSSL&#xff0c;asio要求1.22以上版本&#xff0c;我使用的是1.26.0&#xff1b; 这个版本的asio要求OpenSSL是1.0.2&#xff0c;其他版本我得机器上编不过&#xff0c;ubuntu上默认带的OpenSSL是1.1.1; 所以我下载了OPENSSL1.2.0重…

图像变形之移动最小二乘算法(MLS)

基本原理 基于移动最小二乘的图像变形是通过一组源控制点和目标控制点来控制变形&#xff0c;对于每一个待求变形后位置的点而言&#xff0c;根据预设的形变类型&#xff08;如仿射变换、相似变换、刚性变换&#xff09;求解一个最小二乘优化目标函数估计一个局部的坐标变换矩阵…

Android自定义侧滑Item

源码地址&#xff1a;https://github.com/LanSeLianMa/CustomizeView/tree/master/cehuaitem 使用方式一&#xff1a;XML布局中直接使用 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com…

linux系统服务学习(一)Linux高级命令扩展

文章目录 Linux高级命令&#xff08;扩展&#xff09;一、find命令1、find命令作用2、基本语法3、*星号通配符4、根据文件修改时间搜索文件☆ 聊一下Windows中的文件时间概念&#xff1f;☆ 使用stat命令获取文件的最后修改时间☆ 创建文件时设置修改时间以及修改文件的修改时间…

服务器数据恢复-RAID5多块磁盘离线导致崩溃的数据恢复案例

服务器数据恢复环境&#xff1a; DELL POWEREDGE某型号服务器中有一组由6块SCSI硬盘组建的RAID5阵列&#xff0c;LINUX REDHAT操作系统&#xff0c;EXT3文件系统&#xff0c;存放图片文件。 服务器故障&分析&#xff1a; 服务器raid5阵列中有一块硬盘离线&#xff0c;管理员…

ChatGPT收录

VSCode插件-ChatGPT 多磨助手 多磨助手 (domore.run) Steamship Steamship 免费合集 免费chatGPT - Ant Design Pro 免费AI聊天室 (xyys.one)

SpringBoot复习:(33)WebMvcAutoconfiguration内部静态类WebMvcAutoConfigurationAdapter

WebMvcAutoconfiguration内部静态类WebMvcAutoConfigurationAdapter实现了WebMvcConfigurer接口&#xff0c;重写了一些方法&#xff0c;也就是默认对Spring Mvc进行了一些配置: 该静态类上有个**Import**注解&#xff1a; Import(EnableWebMvcConfiguration.class) 它的父类…

Java课题笔记~ 过滤器

概念 过滤器&#xff1a;顾名思义&#xff0c;就是在源数据和目的数据之间起过滤作用的中间组件。 过滤器可以动态地拦截请求和响应&#xff0c;以变换或使用包含在请求或响应中的信息。 filter是对客户端访问资源的过滤&#xff0c;符合条件放行&#xff0c;不符合条件不放…

MFC编程基础

一、MFC类库简介 ●微软基础类库( Microsoft Foundation Classes, MFC )是Microsoft公司提供的关于Win32 API的C类库集&#xff0c;它定义了一个标准的应用程序框架。 ●借助这个框架,用户可以轻松地开发标准的Windows应用程序。 ●MFC实现了标准的用户…

SAP ABAP 直接把内表转换成PDF格式(smartform的打印函数输出OTF格式数据)

直接上代码&#xff1a; REPORT zcycle055.DATA: lt_tab TYPE TABLE OF zpps001. DATA: ls_tab TYPE zpps001.ls_tab-werks 1001. ls_tab-gamng 150.00. ls_tab-gstrp 20201202. ls_tab-aufnr 000010000246. ls_tab-auart 标准生产. ls_tab-gltrp 20201205. ls_tab-matn…

首发 | FOSS分布式全闪对象存储系统白皮书

一、 产品概述 1. 当前存储的挑战 随着云计算、物联网、5G、大数据、人工智能等新技术的飞速发展&#xff0c;数据呈现爆发式增长&#xff0c;预计到2025年中国数据量将增长到48.6ZB&#xff0c;超过80%为非结构化数据。 同时&#xff0c;数字经济正在成为我国经济发展的新…

JVM 内存结构快速入门

文章目录 一、简介二、JVM内存区域2.1 方法区2.3.2 永久代和元空间 2.2 堆2.1.2 对象的创建和销毁 2.2 栈内存2.2.1 栈帧的组成和作用2.2.2 栈的特点 2.4 程序计数器2.4.1 程序计数器的作用和使用场景 一、简介 Java 内存模型&#xff08;Java Memory Model&#xff0c;JMM&…