LeetCode 457. 环形数组循环(暴力+快慢指针)
生活随笔
收集整理的這篇文章主要介紹了
LeetCode 457. 环形数组循环(暴力+快慢指针)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1. 題目
- 2. 解題
- 2.1 暴力解題
- 2.2 快慢指針
1. 題目
給定一個含有正整數和負整數的環形數組 nums。
如果某個索引中的數 k 為正數,則向前移動 k 個索引。相反,如果是負數 (-k),則向后移動 k 個索引。
因為數組是環形的,所以可以假設最后一個元素的下一個元素是第一個元素,而第一個元素的前一個元素是最后一個元素。
確定 nums 中是否存在循環(或周期)。
循環必須在相同的索引處開始和結束并且循環長度 > 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
總結
以上是生活随笔為你收集整理的LeetCode 457. 环形数组循环(暴力+快慢指针)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 886. 可能的二分法
- 下一篇: 程序员面试金典 - 面试题 17.25.