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

文章目录

    • 1. 题目
    • 2. 解题
      • 2.1 暴力解题
      • 2.2 快慢指针

1. 题目

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

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

示例 1:
输入:[2,-1,1,2,2]
输出:true
解释:存在循环,按索引 0 -> 2 -> 3 -> 0 。循环长度为 3 。示例 2:
输入:[-1,2]
输出:false
解释:按索引 1 -> 1 -> 1 ... 的运动无法构成循环,
因为循环的长度为 1 。根据定义,循环的长度必须大于 1 。示例 3:
输入:[-2,1,-1,-2,-2]
输出:false
解释:按索引 1 -> 2 -> 1 -> ... 的运动无法构成循环,
因为按索引 1 -> 2 的运动是向前的运动,
而按索引 2 -> 1 的运动是向后的运动。
一个循环中的所有运动都必须沿着同一方向进行。提示:
-1000 ≤ nums[i]1000
nums[i]0
0 ≤ nums.length ≤ 5000进阶:
你能写出时间时间复杂度为 O(n) 和额外空间复杂度为 O(1) 的算法吗?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/circular-array-loop
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 参考题解区泡菜哥

2.1 暴力解题

class Solution {
public:bool circularArrayLoop(vector<int>& nums) {if(nums.empty()) return false;int i, j, count, nextidx, n = nums.size();for (i = 0; i < n; i++){j = i;//i 是起点count = 1;//个数计数vector<bool> visited(n,false);//是否访问过while(true){if(visited[j])//重复访问,有环break;visited[j] = true;nextidx = (nums[j]%n+j+n)%n;//下一个位置if(nums[j]*nums[nextidx] < 0)break;//方向反了,不对,只能朝一个方向if(nextidx == i && count > 1)return true;j = nextidx;count++;}}return false;}
};

116 ms 8.3 MB

2.2 快慢指针

class Solution {int next(vector<int>& nums, int i){return (nums[i]%n+i+n)%n;//下一个位置}int n;
public:bool circularArrayLoop(vector<int>& nums) {if(nums.empty()) return false;int i, slow, fast, nt, count;n = nums.size();for(i = 0; i < n; ++i){if(nums[i] == 0)continue;slow = i;fast = next(nums, i);//下一个位置while(nums[slow]*nums[fast] > 0 && nums[fast]*nums[next(nums,fast)] > 0){	//快和慢的下一个都是同号的if(fast == slow){if(slow == next(nums, slow))break;//个数为1elsereturn true;}slow = next(nums,slow);//慢的走一步fast = next(nums, next(nums,fast));//快的走两步}slow = i;while(nums[slow]*nums[next(nums, slow)] > 0){	//把走过的点标记成0,题目说没有数字为0nt = next(nums, slow);nums[slow] = 0;//标记访问过了slow = nt;}}return false;}
};

0 ms 7.3 MB

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

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

相关文章

SQLite外键

SQLite外键(Foreign Key)支持 从SQLite 3.6.19 开始支持 外键约束. (Ubuntu 10.04 的SQLite版本是 3.6.22, Debian 6.0 的SQLite版本是 3.7.0) 外键约束用来强制 两个表之间”存在”的关系. 比如, 考虑下面的SQL命令建立的schema CREATE TABLE artist(artistid INTEGER PRIMA…

帝国cms搜索php分页,帝国cms V7.2自定义分页(列表分页,内容分页)样式步骤

【1】自己修改帝国cms默认的分页样式(css)&#xff0c;这样做的好处是你不用去改动帝国的核心文件&#xff0c;方便以后升级。【2】自己动手去修改帝国的分页(phpcss)&#xff0c;帝国的分页在e>class>下的t_functions.php这个文件里。列表页模板[!--show.page--]:分页导…

LeetCode 435. 无重叠区间(贪心/动态规划)

文章目录1. 题目2. 解题2.1 贪心2.2 动态规划1. 题目 给定一个区间的集合&#xff0c;找到需要移除区间的最小数量&#xff0c;使剩余区间互不重叠。 注意: 可以认为区间的终点总是大于它的起点。 区间 [1,2] 和 [2,3] 的边界相互“接触”&#xff0c;但没有相互重叠。 示例…

UDP广播包的研究

一直以来听的多了&#xff0c;什么UDP广播之类的&#xff0c;不过自己一直没有试验过&#xff0c;这次闲来无聊&#xff0c;于是测试了一下。网上说的其实并不是非常的正确&#xff0c;流传着不少的错误言论&#xff0c;这次自己动手测试了一下&#xff0c;没想到比我想象中的还…

php传递字符串给python,用PHP和Python生成短链接服务的字符串ID

假设你想做一个像微博短链接那样的短链接服务&#xff0c;短链接服务生成的URL都非常短例如: http://t.cn/E70Piib, 我们应该都能想到链接中的E70Piib对应的就是存储长链接地址的数据记录的ID&#xff0c;可是这个有大小写字母和数字构成的唯一ID是怎么生成的呢&#xff0c;刚学…

LeetCode 433. 最小基因变化(广度优先搜索)

1. 题目 一条基因序列由一个带有8个字符的字符串表示&#xff0c;其中每个字符都属于 “A”, “C”, “G”, "T"中的任意一个。 假设我们要调查一个基因序列的变化。一次基因变化意味着这个基因序列中的一个字符发生了变化。 例如&#xff0c;基因序列由"AAC…

JCP执行委员会新成员选举结果揭晓:Hologic未获通过

转载于:https://www.cnblogs.com/mixer/archive/2010/11/09/2448777.html

matlab fig生成exe,MATLAB GUI多个m文件和fig如何生成exe文件

&#xff0b;文件。命令的格式为&#xff1a;mcc[-option]fun[fun2...][mexfile1.....&#xff0b;文件。命令的格式为&#xff1a;mcc[-option]fun[fun2...][mexfile1.....function start_Callback(hObject, eventdata, handle...你的意思是&#xff1a;多个m文件导成一个吗&a…

Eclipse 编写代码自动提示设置

很多人不知道Eclipse如何开启代码助手的自动提示功能&#xff0c;只是使用Eclipse默认的输入了“.”之后才会出现提示。实际上可以输入任何字符的时候都可以给出提示。 设置如下: 打开 Eclipse -> Window -> Perferences&#xff0c;会打开个Perferences 的设置界面。 打…

LeetCode 436. 寻找右区间(二分查找)

1. 题目 给定一组区间&#xff0c;对于每一个区间 i&#xff0c;检查是否存在一个区间 j&#xff0c;它的起始点大于或等于区间 i 的终点&#xff0c;这可以称为 j 在 i 的“右侧”。 对于任何区间&#xff0c;你需要存储的满足条件的区间 j 的最小索引&#xff0c;这意味着区…

老鼠走迷宫php算法,C语言经典算法 - 老鼠走迷官(一)

C语言经典算法 - 老鼠走迷官(一)说明老鼠走迷宫是递回求解的基本题型&#xff0c;我们在二维阵列中使用2表示迷宫墙壁&#xff0c;使用1来表示老鼠的行走路径&#xff0c;试以程式求出由入口至出口的路径。解法老鼠的走法有上、左、下、右四个方向&#xff0c;在每前进一格之后…

LeetCode 491. 递增子序列(回溯+判重剪枝)

1. 题目 给定一个整型数组, 你的任务是找到所有该数组的递增子序列&#xff0c;递增子序列的长度至少是2。 示例: 输入: [4, 6, 7, 7] 输出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]]说明: 给定数组的长度不会超过15。 数组中的整数范…

[网络收集]Web.config配置文件详解

摘录自&#xff1a;http://hi.baidu.com/fanfanwuji/blog/item/a7fd8928d49a7ef098250a06.html 花了点时间整理了一下ASP.NET Web.config配置文件的基本使用方法。很适合新手参看&#xff0c;由于Web.config在使用很灵活&#xff0c;可以自定义一些节点。所以这里只介绍一些比较…

python怎么写方程条件,条件方程曲线拟合

在xmin处多项式的导数0的条件可以表示为一个简单的约束&#xff0c;这意味着变量p2&#xff0c;p3&#xff0c;和{}实际上并不独立。衍生条件是p2 2*p3*xmin 3*p4*xmin**2 0其中xmin是xdata的最小值。此外&#xff0c;xmin将在fit之前知道(如果不一定是在编写脚本时)&#x…

LeetCode 525. 连续数组(前缀和+哈希)

1. 题目 给定一个二进制数组, 找到含有相同数量的 0 和 1 的最长连续子数组&#xff08;的长度&#xff09;。 示例 1: 输入: [0,1] 输出: 2 说明: [0, 1] 是具有相同数量0和1的最长连续子数组。示例 2: 输入: [0,1,0] 输出: 2 说明: [0, 1] (或 [1, 0]) 是具有相同数量0和1的…

SQL Server常用的系统存储过程应用实例(转)

摘要&#xff1a;Sql Server自带的系统存储过程有许多&#xff0c;但大部分我们是不常用的。我在实践中根据自己的体会&#xff0c;总结整理了一些比较常用的&#xff0c;加上一些实例介绍给大家。本期介绍&#xff1a; l sp_attach_db l sp_attach_single_fil…

angular 权限 php,PHP,Angular,HTACCESS-仅允许来自源域的请求

我完成了我的角度项目。在我的项目中&#xff0c;我向PHP文件发送带有数据的POST请求&#xff0c;然后将结果返回给Angular。现在我只允许来自源域的请求&#xff0c;并拒绝来自任何域的请求。我尝试使用:header("Access-Control-Allow-Origin: example.com");但不管…

LeetCode 516. 最长回文子序列(动态规划)

1. 题目 给定一个字符串s&#xff0c;找到其中最长的回文子序列。可以假设s的最大长度为1000。 示例 1: 输入: "bbbab" 输出: 4 一个可能的最长回文子序列为 "bbbb"。示例 2: 输入: "cbbd" 输出: 2 一个可能的最长回文子序列为 "bb"…

点击图片,AJAX删除后台图片文件

点击页面上的图片&#xff0c;用jQuery的AJAX来删除后台真实的文件。包含了2个页面&#xff0c;一个是显示图片的页面&#xff0c;一个是传递文件名&#xff0c;然后删除真实图片的页面。具体的代码如下&#xff1a;ShowPics.htm:<!DOCTYPE html PUBLIC "-//W3C//DTD X…

granule size oracle,_ksmg_granule_size oracle内存分配粒度

_ksmg_granule_size oracle内存分配粒度_ksmg_granule_size:内存分配粒度大小oracle内存分配的最小单位&#xff0c;最终分配的内存数量都是这个参数的整数倍10g中这个参数的大小一般遵循如下原则&#xff1a;– sga_max_size < 1024M then _ksmg_granule_size 4M- sga_ma…