LeetCode 457. 环形数组循环(暴力+快慢指针)
文章目錄
- 1. 題目
- 2. 解題
- 2.1 暴力解題
- 2.2 快慢指針
1. 題目
給定一個(gè)含有正整數(shù)和負(fù)整數(shù)的環(huán)形數(shù)組 nums。
如果某個(gè)索引中的數(shù) k 為正數(shù),則向前移動(dòng) k 個(gè)索引。相反,如果是負(fù)數(shù) (-k),則向后移動(dòng) k 個(gè)索引。
因?yàn)閿?shù)組是環(huán)形的,所以可以假設(shè)最后一個(gè)元素的下一個(gè)元素是第一個(gè)元素,而第一個(gè)元素的前一個(gè)元素是最后一個(gè)元素。
確定 nums 中是否存在循環(huán)(或周期)。
循環(huán)必須在相同的索引處開(kāi)始和結(jié)束并且循環(huán)長(zhǎng)度 > 1。
此外,一個(gè)循環(huán)中的所有運(yùn)動(dòng)都必須沿著同一方向進(jìn)行。
換句話說(shuō),一個(gè)循環(huán)中不能同時(shí)包括向前的運(yùn)動(dòng)和向后的運(yùn)動(dòng)。
來(lái)源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/circular-array-loop
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
2. 解題
- 參考題解區(qū)泡菜哥
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 是起點(diǎn)count = 1;//個(gè)數(shù)計(jì)數(shù)vector<bool> visited(n,false);//是否訪問(wèn)過(guò)while(true){if(visited[j])//重復(fù)訪問(wèn),有環(huán)break;visited[j] = true;nextidx = (nums[j]%n+j+n)%n;//下一個(gè)位置if(nums[j]*nums[nextidx] < 0)break;//方向反了,不對(duì),只能朝一個(gè)方向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;//下一個(gè)位置}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);//下一個(gè)位置while(nums[slow]*nums[fast] > 0 && nums[fast]*nums[next(nums,fast)] > 0){ //快和慢的下一個(gè)都是同號(hào)的if(fast == slow){if(slow == next(nums, slow))break;//個(gè)數(shù)為1elsereturn true;}slow = next(nums,slow);//慢的走一步fast = next(nums, next(nums,fast));//快的走兩步}slow = i;while(nums[slow]*nums[next(nums, slow)] > 0){ //把走過(guò)的點(diǎn)標(biāo)記成0,題目說(shuō)沒(méi)有數(shù)字為0nt = next(nums, slow);nums[slow] = 0;//標(biāo)記訪問(wèn)過(guò)了slow = nt;}}return false;} };0 ms 7.3 MB
總結(jié)
以上是生活随笔為你收集整理的LeetCode 457. 环形数组循环(暴力+快慢指针)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: LeetCode 886. 可能的二分法
- 下一篇: 程序员面试金典 - 面试题 17.25.