索引超出范圍怎么解決,數組索引必須為正整數或邏輯值_LeeCode457-環形數組循環

 2023-10-04 阅读 25 评论 0

摘要:今天有些偷懶了一天就做了兩道算法題英語沒看專業知識沒復習索引超出范圍怎么解決。可能就得從上午的那篇論文被拒開始的吧題目描述:給定一個含有正整數和負整數的環形數組 nums。 如果某個索引中的數 k 為正數,則向前移動 k 個索引。相反,如果是負數 (-

e17912e20ea7e74ff2766cfee4d78ffc.png

今天有些偷懶了

一天就做了兩道算法題

英語沒看

專業知識沒復習

索引超出范圍怎么解決。可能就得從上午的那篇論文被拒開始的吧


題目描述:

給定一個含有正整數和負整數的環形數組 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 的運動是向后的運動。一個循環中的所有運動都必須沿著同一方向行。

提示:

1. -1000 ≤ nums[i] ≤ 1000
nums[i] ≠ 0
0 ≤ nums.length ≤ 5000

思路解析:

這題的話講真,我剛開始真沒多少思路。后來能想到的也就是暴力法吧,無非就是第一層遍歷nums數組,選定一個元素后,對該元素進行“跳棋”操作。這里面就有幾點需要注意:

1. 一個循環中的所有運動都必須沿著同一方向進行
2. 循環必須在相同的索引處開始和結束并且循環長度 > 1

為了解決條件一的同向問題,我是設定了route集合,只要當前元素的值大于0,就往route集合里加1,反之加-1。如果發現全1集合里出現了-1,或者全-1集合里出現了1,那就立即退出。為了解決條件二,我是設定了index集合,每次添加當前元素的下標,只要當前元素對應的下標出現在index集合內,并且不與index集合內最后一個元素相同,說明nums 中是存在循環,立即退出。

代碼如下:

class Solution(object):def circularArrayLoop(self, nums):""":type nums: List[int]:rtype: bool"""if len(nums) <= 1:return Falseflag = Falsefor start in range(len(nums)):route = []indexs = []while len(route) <= len(nums) + 1:indexs.append(start)if nums[start] > 0:route.append(1)if sum(route) != len(route):flag = Falsebreakelse:route.append(-1)if sum(route) != -1 * len(route):flag = Falsebreakstart = (nums[start] + start + len(nums)) % len(nums)if start == indexs[-1]:flag = Falsebreakif start in indexs:flag = Truebreakif flag is True:return Truereturn Falseif __name__ == "__main__":nums = [-1, 2]result = Solution().circularArrayLoop(nums)print(result)

數組索引必須為正整數或邏輯值,但是暴力法,你懂得,一般都是超出時間限制了。

后來,就在網上找到了改進的方法。該方法的核心就是快慢指針法,快慢指針的思想是慢指針走一步,快指針走兩步,若他倆相遇肯定是在環中的某一個節點上相遇,則證明存在環。有了這個,那就可以把我們的方法在做一些修改。

代碼如下:

class Solution(object):def circularArrayLoop(self, nums):""":type nums: List[int]:rtype: bool"""def getNext(i):return (nums[i]+i)%NN = len(nums)for i in range(N):if nums[i]==0: continue slow = i # 慢指針代表當前位置fast = getNext(i) # 快指針代表下一個位置# 快慢指針同向且慢指針和快指針下一個也要同向while(nums[slow]*nums[fast]>0 and nums[slow]*nums[getNext(fast)]>0):if slow==fast: # 快慢指針相遇if slow==getNext(slow):break # 循環長度為1的情況return Trueslow = getNext(slow)fast = getNext(getNext(fast))return Falseif __name__ == "__main__":nums = [-1, 2]result = Solution().circularArrayLoop(nums)print(result)

執行效率也還不錯,在500ms左右。畢竟沒有用到O(n)的時間復雜度,但是這個也真的想不出來,各位要是想到了還煩請告知在下。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/112105.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息