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

news2024/11/22 18:13:52

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.coloradmin.cn/o/880847.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

01|Java中常见错误或不清楚

补充&#xff1a;length vs length() vs size() 1 java中的length属性是针对数组说的,比如说你声明了一个数组,想知道这个数组的长度则用到了length这个属性. 2 java中的length()方法是针对字符串String说的,如果想看这个字符串的长度则用到length()这个方法. 3.java中的siz…

你是否知道,汽车充电桩控制主板也有可调性?

你是否知道&#xff0c;汽车充电桩控制主板也有可调性?它可以随着使用环境的改变&#xff0c;调整充电桩的参数&#xff0c;满足不同的需求。那么&#xff0c;它的可调性到底体现在哪些方面呢? 汽车充电桩控制板的可调性主要体现在以下三个方面&#xff1a; 1. 设备的参数调节…

nodejs+vue+elementui考研互助交流网站

语言 node.js 框架&#xff1a;Express 前端:Vue.js 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;VScode 前端nodejsvueelementui,该系统采用vue技术和B/S结构进行开发设计&#xff0c;后台使用MySQL数据库进行数据存储。系统主要分为两大模…

Unity框架学习--5 事件中心管理器

作用&#xff1a;访问其它脚本时&#xff0c;不直接访问&#xff0c;而是通过发送一条“命令”&#xff0c;让监听了这条“命令”的脚本自动执行对应的逻辑。 原理&#xff1a; 1、让脚本向事件中心添加事件&#xff0c;监听对应的“命令”。 2、发送“命令”&#xff0c;事件…

低压系统浪涌保护器的综合应用方案

低压系统浪涌保护器&#xff08;Surge Protective Device&#xff0c;SPD&#xff09;是一种用于限制瞬态过电压和导引泄放电涌电流的非线性防护器件&#xff0c;用以保护耐压水平低的电器或电子系统免遭雷击及雷击电磁脉冲或操作过电压的损害。SPD的应用可以有效提高低压系统的…

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

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

怎么使用手机远程控制Win10电脑?

可以使用手机远程控制电脑吗&#xff1f; “近期&#xff0c;我将出差一段时间。问题是&#xff0c;我希望能够从很远的地方浏览家里电脑上的一些东西&#xff0c;但我不会一直随身携带笨重的笔记本电脑。我可以手机远程访问Windows电脑吗&#xff1f; ” 当然&am…

亚马逊feedback和review有什么区别

在亚马逊上&#xff0c;"Feedback"&#xff08;反馈&#xff09;和"Review"&#xff08;评论&#xff09;是两个不同的概念&#xff0c;它们在购物体验中起着不同的作用。 Feedback&#xff08;反馈&#xff09;&#xff1a; 亚马逊的"Feedback"…

Jay17 2023.8.14日报 即 留校集训阶段性总结

8.14 打了moeCTF&#xff0c;还剩一题ak Web。 Jay17-集训结束阶段性总结&#xff1a; 集训产出&#xff1a; 自集训开始以来一个半月&#xff0c;最主要做的事情有三。 一是跟课程&#xff0c;复习学过的知识&#xff0c;学习新的知识&#xff1b;目前课程已大体听完&…

QGIS3.28的二次开发九:添加矢量要素

对矢量要素的编辑是 GIS 软件很重要的功能点之一&#xff0c;也是最难实现的功能点之一。编辑矢量要素涉及到很多方面的考虑&#xff0c;包括且不限于矢量要素的几何类型&#xff0c;拓扑关系&#xff0c;构成要素的节点的增删改&#xff0c;编辑会话 (session) 的启动、回溯和…

Tuxera NTFS Mac2023最新免费版Mac读写工具

有时候我们在使用苹果笔记本的时候&#xff0c;会遇到一些问题&#xff0c;比如怎么打开移动硬盘&#xff0c;或者为什么苹果电脑读不出U盘。这些问题可能让我们感到困惑和沮丧&#xff0c;但其实都有解决办法。本文就来为大家介绍一下苹果笔记本怎么打开移动硬盘和苹果电脑读不…

MRO数字化帮助企业实现明显降本增效

MRO&#xff08;Maintenance, Repair and Operations&#xff09;数字化是指将传统的维修、保养和运营管理过程数字化&#xff0c;以提高效率、降低成本、提高质量和可靠性。MRO数字化是企业数字化转型的重要抓手之一&#xff0c;因为它可以帮助企业实现明显的降本增效。 MRO数…

CSS变形与动画(二):perspctive透视效果 与 preserve-3d 3d效果(奥运五环例子)

文章目录 perspective 3d透视效果preserve-3d 3d嵌套效果例子 奥运五环 backface-visibility 背面效果 perspective 3d透视效果 perspective 指定了观察者与 z0 平面的距离&#xff0c;使具有三维位置变换的元素产生透视效果。z>0 的三维元素比正常大&#xff0c;而 z<0 …

WMS系统库存锁定:提升物流管理效率

一、库存锁定的概念 库存锁定是WMS系统中的一个重要功能&#xff0c;它在物流运作过程中发挥着关键的作用。库存锁定是指在物流流程中&#xff0c;将特定的库存数量或者位置与订单或任务相关联&#xff0c;以确保这些库存不会在未经授权的情况下被其他操作所改变或消耗。库存锁…

「2024」预备研究生mem-论证推理强化:引入前提(上)

一、引入前提&#xff08;上&#xff09; 二、课后练习

DP——背包问题

DP——背包问题 01背包问题分数背包问题多重背包问题完全背包问题 当我们谈论背包问题时&#xff0c;可以想象成一个小朋友要去旅行&#xff0c;但是他只能带一个容量有限的背包。他有一些物品可以选择放入背包&#xff0c;每个物品都有自己的重量和价值。小朋友的目标是在不超…

安卓逆向 - 某麦网 x-mini-wua x-sgext x-sign x-umt x-utdid

本文仅供学习交流&#xff0c;只提供关键思路不会给出完整代码&#xff0c;严禁用于非法用途&#xff0c;若有侵权请联系我删除&#xff01; 目标app: 5aSn6bqm572ROC41LjQ 目标接口&#xff1a;aHR0cHM6Ly9hY3MubS50YW9iYW8uY29tL2d3L210b3AuZGFtYWkud2lyZWxlc3MuZGlzY292ZX…

【历史上的今天】8 月 15 日:苹果推出初代 iMac;谷歌收购摩托罗拉移动;Fuchsia 首次发布

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 8 月 15 日&#xff0c;在 1878 年的今天&#xff0c;我国第一套邮票发行。中国是一个文明古国&#xff0c;在邮政通信方面&#xff0c;有着悠久的历史。早在三…

C语言实例_和校验算法

一、算法介绍 和校验&#xff08;Checksum&#xff09;是一种简单的纠错算法&#xff0c;用于检测或验证数据传输或存储过程中的错误。它通过对数据进行计算并生成校验和&#xff0c;然后将校验和附加到数据中&#xff0c;在接收端再次计算校验和并进行比较&#xff0c;以确定…

10个经典战略分析模型,助力洞察市场明确优势

在企业的经营管理过程中&#xff0c;要时刻清晰内外部环境和自身的优劣势&#xff0c;做好企业略规划&#xff0c;进行企业内外部资源的分析&#xff0c;对经营环境&#xff0c;企业核心竞争力有足够的判断&#xff0c;才能明确企业的发展方向。本文为大家分享10个常用的战略分…