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;
	}
}

经验吸取

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HTML详解连载(7)

HTML详解连载&#xff08;7&#xff09; 专栏链接 [link](http://t.csdn.cn/xF0H3)下面进行专栏介绍 开始喽结构伪类选择器作用 :nth-child&#xff08;公式&#xff09;作用举例 伪元素选择器作用注意&#xff1a; PxCoook作用盒子模型-重要组成部分 盒子模型-边框线属性名属性…

win10中Docker安装、构建镜像、创建容器、Vscode连接实例

Docker方便一键构建项目所需的运行环境&#xff1a;首先构建镜像(Image)。然后镜像实例化成为容器(Container)&#xff0c;构成项目的运行环境。最后Vscode连接容器&#xff0c;方便我们在本地进行开发。下面以一个简单的例子介绍在win10中实现&#xff1a;Docker安装、构建镜像…

在 Linux 虚拟机上使用 Azure 自定义脚本扩展版本

参考 azure创建虚拟机,创建虚拟机注意入站端口规则开放80端口、 2.转到资源&#xff0c;点击扩展应用程序&#xff0c;创建存储账户&#xff0c;创建容器&#xff0c;上传文件&#xff0c;选择文件&#xff0c;会自动执行部署。 apt-get update -y && apt-get insta…

【Rust】Rust学习 第十二章一个 I/O 项目:构建一个命令行程序

本章既是一个目前所学的很多技能的概括&#xff0c;也是一个更多标准库功能的探索。我们将构建一个与文件和命令行输入/输出交互的命令行工具来练习现在一些你已经掌握的 Rust 技能。 Rust 的运行速度、安全性、单二进制文件输出和跨平台支持使其成为创建命令行程序的绝佳选择…

Failed to execute goal org.apache.maven.plugins

原因&#xff1a; 这个文件D:\java\maven\com\ruoyi\pg-student\maven-metadata-local.xml出了问题 解决&#xff1a; 最简单的直接删除D:\java\maven\com\ruoyi\pg-student\maven-metadata-local.xml重新打包 或者把D:\java\maven\com\ruoyi\pg-student这个目录下所有文件…

面试热题(每日温度)

请根据每日 气温 列表 temperatures &#xff0c;重新生成一个列表&#xff0c;要求其对应位置的输出为&#xff1a;要想观测到更高的气温&#xff0c;至少需要等待的天数。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替。 输入: temperatures [73,74,75,71,69…

面试题-React(一):React是什么?它的主要特点是什么?

探索React&#xff1a;前端开发中的重要角色与主要特点 引言&#xff1a; 在现代前端开发领域&#xff0c;React已经成为最受欢迎和广泛使用的JavaScript库之一。它由Facebook开发并于2013年首次发布。随着时间的推移&#xff0c;React在开发社区中获得了强大的支持和认可。本…

Linux NTP原理及配置使用

一、NTP简介 1.NTP简介 NTP&#xff08;Network Time Protocol&#xff0c;网络时间协议&#xff09;是用来使网络中的各个计算机时间同步的一种协议。它的用途是把计算机的时钟同步到世界协调时UTC&#xff0c;其精度在局域网内可达0.1ms&#xff0c;在互联网上绝大多数的…

iptables之iptables表、链、规则 、匹配模式、扩展模块、连接追踪模块(一)

一、iptables的链 1.请求到达本机&#xff1a; PREROUTING --> INPUT --> Local Process &#xff08;本机&#xff09; 2.请求经过本机&#xff1a; PREROUTING --> FORWARD --> POSTROUTING 3.请求从本机发出&#xff1a;local Process&#xff08;本机&#xf…

【PostgreSQL的CLOG解析】

同样还是这张图&#xff0c;之前发过shared_buffer和os cache、wal buffer和work mem的文章&#xff0c;今天的主题是图中的clog&#xff0c;即 commit log&#xff0c;PostgreSQL10之前放在数据库目录的pg_clog下面。PostgreSQL10之后修更名为xact,数据目录变更为pg_xact下面&…

创建一个 React+Typescript 项目

接下来 我们来一起探索一下用TypeScript 来编写react 这也是一个非常好的趋势&#xff0c;目前也非常多人使用 那么 我们就先从创建项目开始 首先 我们先找一个 或者 之前创建一个目录 用来放我们的项目 然后 在这个目录下直接输入 例如 这里 我想创建一个叫 tsReApp 的项目…

司徒理财:8.15早盘黄金1905多,最新操作建议

黄金昨日虽然再次新低&#xff0c;但是在司徒所强调的1902位置企稳&#xff0c;反弹即将开启&#xff0c;早盘依托1902的支撑低多看涨&#xff0c;1905现价可以直接多&#xff01;黄金本次的下跌已经接近尾声&#xff0c;弱不再弱必转强&#xff01;长时间大幅度的下跌后必将迎…

约数之和(质因子分解)

思路&#xff1a; &#xff08;1&#xff09;由数论基本定理&#xff0c;任何一个正整数x都能写作&#xff0c;其中p1,p2..pk为x的质因子。 &#xff08;2&#xff09; 由此可以推断&#xff0c;要求一个数约数的和&#xff0c;注意到约数就是p1,p2...pk的一种组合&#xff0…

初学HTML:在线简易画板设计。

最近在HTML&#xff0c;记录下一点点成果。 设计了一个简易画板&#xff0c;通过HTML的Canvas元素实现一个在线画板&#xff0c;用户可以在上面绘制图形或涂鸦。 下面是运行效果&#xff1a; 下面是代码&#xff1a; <!DOCTYPE html> <html> <head><ti…

ZooKeeper的应用场景(数据发布订阅、负载均衡)

ZooKeeper是一个典型的发布/订阅模式的分布式数据管理与协调框架&#xff0c;开发人员可以使用它来进行分布式数据的发布与订阅。另一方面&#xff0c;通过对ZooKeeper中丰富的数据节点类型进行交叉使用&#xff0c;配合Watcher事件通知机制&#xff0c;可以非常方便地构建一系…

时序预测 | MATLAB基于扩散因子搜索的GRNN广义回归神经网络时间序列预测(多指标,多图)

时序预测 | MATLAB基于扩散因子搜索的GRNN广义回归神经网络时间序列预测(多指标,多图) 目录 时序预测 | MATLAB基于扩散因子搜索的GRNN广义回归神经网络时间序列预测(多指标,多图)效果一览基本介绍程序设计学习小结参考资料效果一览

每天一道leetcode:剑指 Offer 13. 机器人的运动范围(中等广度优先遍历剪枝)

今日份题目&#xff1a; 地上有一个m行n列的方格&#xff0c;从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0]的格子开始移动&#xff0c;它每次可以向左、右、上、下移动一格&#xff08;不能移动到方格外&#xff09;&#xff0c;也不能进入行坐标和列坐标的数位之…

K8S系列一:概念入门

写在前面 本文组织方式&#xff1a; K8S的架构、作用和目的。需要首先对K8S整体有所了解。 K8S是什么&#xff1f; 为什么是K8S&#xff1f; K8S怎么做&#xff1f; K8S的重要概念&#xff0c;即K8S的API对象。要学习和使用K8S必须知道和掌握的几个对象。 Pod 实例 Volume 数…

Linux下常见的代理服务器软件介绍

在Linux系统中&#xff0c;代理服务器是我们搭建网络环境和处理网络请求的常用工具。但是&#xff0c;你知道Linux下常见的代理服务器软件有哪些吗&#xff1f;本文将为你带来对几款常见的Linux代理服务器软件的介绍&#xff0c;帮助你选择适合的代理服务器。 一、Squid&#…

【Linux命令行与Shell脚本编程】第十九章 正则表达式

Linux命令行与Shell脚本编程 第十九章 正则表达式 文章目录 Linux命令行与Shell脚本编程 第十九章 正则表达式九.正则表达式9.1.正则表达式基础9.1.1.正则表达式的类型9.2.定义BRE模式9.2.1.普通文本9.2.2.特殊字符 9.2.3.锚点字符锚定行首^锚定行尾$组合锚点 9.2.4.点号字符\.…