日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/7/5 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

總結

以上是生活随笔為你收集整理的LeetCode 457. 环形数组循环(暴力+快慢指针)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。