国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

457. 環(huán)形數(shù)組循環(huán)

RaoMeng / 824人閱讀

摘要:問題問題描述給定一組含有正整數(shù)和負(fù)整數(shù)的數(shù)組。假設(shè)數(shù)組首尾相接。判斷數(shù)組中是否有環(huán)。你能寫出時(shí)間復(fù)雜度為且空間復(fù)雜度為的算法嗎示例給定數(shù)組有一個(gè)循環(huán),從索引。給定數(shù)組沒有循環(huán)。注意給定數(shù)組保證不包含元素。

問題 問題描述

給定一組含有正整數(shù)和負(fù)整數(shù)的數(shù)組。如果某個(gè)索引中的 n 是正數(shù)的,則向前移動(dòng) n 個(gè)索引。相反,如果是負(fù)數(shù)(-n),則向后移動(dòng) n 個(gè)索引。
假設(shè)數(shù)組首尾相接。判斷數(shù)組中是否有環(huán)。環(huán)中至少包含 2 個(gè)元素。環(huán)中的元素一律“向前”或者一律“向后”。
你能寫出時(shí)間復(fù)雜度為 O(n) 且空間復(fù)雜度為 O(1) 的算法嗎?

示例

給定數(shù)組 [2, -1, 1, 2, 2], 有一個(gè)循環(huán),從索引 0 -> 2 -> 3 -> 0。

給定數(shù)組[-1, 2], 沒有循環(huán)。

注意

給定數(shù)組保證不包含元素"0"。


解答

此題若是沒有時(shí)間和空間復(fù)雜度的限制的話是非常簡單的。但是想要達(dá)到O(n)時(shí)間復(fù)雜度和O(1)空間復(fù)雜度就比較困難,看了別人寫的一些博客,還沒有看到同時(shí)達(dá)到上述兩個(gè)要求的。

通過思考可以知道,想要在一邊循環(huán)中得到答案同時(shí)又保證O(1)的復(fù)雜度就要充分利用輸入的列表nums。對(duì)于nums的每個(gè)值我們至少要能獲得以下三個(gè)信息:

是否是搜索過的

是否是正在搜索的

是否還未搜索

由于0保證不包含在列表中,所以可以用0作為已經(jīng)搜索過且不存在環(huán)的標(biāo)志;在最開始先求出列表中絕對(duì)值最大的數(shù)k,再將每個(gè)正整數(shù)加k,每個(gè)負(fù)整數(shù)減k,這樣不在-k到k中的就可以作為還未搜索的標(biāo)志;反之就是正在搜索的。

解決了這個(gè)問題之后,還有一個(gè)關(guān)鍵的問題。當(dāng)某一次搜索失敗時(shí),如何將這一次搜索過的元素改為0。如果通過遍歷就會(huì)導(dǎo)致時(shí)間復(fù)雜度提高,顯然不可以通過這樣粗暴的方式。于是便想到了指針的思想,當(dāng)搜索時(shí),每一個(gè)搜索位置都存儲(chǔ)上一個(gè)搜索的位置信息,這樣當(dāng)搜索失敗時(shí),就可以沿著此信息將所有此次搜索的元素全部改為0。具體細(xì)節(jié)請(qǐng)參考以下代碼:

class Solution(object):
    def circularArrayLoop(self, nums):
        """
        :type nums: List[int]
        :rtype: bool
        """
        k = len(nums)
        if k > 1:
            l = max([abs(max(nums)), abs(min(nums))])
            for i in range(k):
                if nums[i] > 0 :
                    nums[i] += l
                else:
                    nums[i] -= l
            for i in range(k):
                if nums[i] > l and (nums[i] - l) % k != 0:
                    a = (nums[i] - l + i) % k  #下一位置的索引
                    b = i                      #當(dāng)前位置索引
                    nums[i] = -1
                    while nums[a] > l and (nums[a] - l) % k != 0:
                        c = nums[a]
                        nums[a] = b
                        b = a
                        a = (a + c - l) % k
                    if 0 < nums[a] <= l or nums[a] == -1:
                        return True
                    else:
                        while nums[b] != -1:
                            a = nums[b]
                            nums[b] = 0
                            b = a
                        nums[b] = 0
                elif nums[i] < -l and (nums[i] + l) % k != 0:
                    a = (i + nums[i] + l) % k  #下一位置的索引
                    b = i                      #當(dāng)前位置索引
                    nums[i] = 1
                    while nums[a] < -l and (nums[a] + l) % k != 0:
                        c = nums[a]
                        nums[a] = b
                        b = a
                        a = (a + c + l) % k
                    if 0 < nums[a] <= l or nums[a] == 1:
                        return True
                    else:
                        while nums[b] != 1:
                            a = nums[b]
                            nums[b] = 0
                            b = a
                        nums[b] = 0
        return False

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/42786.html

相關(guān)文章

  • Leetcode:刷完31道鏈表題的一點(diǎn)總結(jié)

    摘要:既然說到地址空間了就順帶說一下上面環(huán)形鏈表這道題的另一種很的解法吧。介紹完常規(guī)操作鏈表的一些基本知識(shí)點(diǎn)后,現(xiàn)在回到快慢指針。 ??前幾天第一次在 Segmentfault 發(fā)文—JavaScript:十大排序的算法思路和代碼實(shí)現(xiàn),發(fā)現(xiàn)大家似乎挺喜歡算法的,所以今天再分享一篇前兩個(gè)星期寫的 Leetcode 刷題總結(jié),希望對(duì)大家能有所幫助。 ??本文首發(fā)于我的blog 前言 ??今天終于...

    DevTalking 評(píng)論0 收藏0
  • 如何使用數(shù)組實(shí)現(xiàn)滑動(dòng)窗口

    摘要:理解數(shù)組實(shí)現(xiàn)的滑動(dòng)窗口,看下邊這個(gè)圖就可以了。第秒,開始計(jì)數(shù),此時(shí)數(shù)組內(nèi)開始存入計(jì)數(shù)周期,保存在數(shù)組第個(gè)位置,表示這是當(dāng)前滑動(dòng)窗口內(nèi)的第個(gè)計(jì)數(shù)周期。在FireflySoft.RateLimit之前的版本中,進(jìn)程內(nèi)滑動(dòng)窗口的實(shí)現(xiàn)是基于MemoryCache做的,雖然能夠正確的實(shí)現(xiàn)滑動(dòng)窗口的算法邏輯,但是性能比較差,其吞吐量只有其它算法的1/4。性能為何如此之差呢?滑動(dòng)窗口的原理我們先來看下滑動(dòng)...

    不知名網(wǎng)友 評(píng)論0 收藏0
  • 數(shù)據(jù)結(jié)構(gòu)知否知否系列之 — 隊(duì)列篇

    摘要:初始化隊(duì)列初始化一個(gè)存儲(chǔ)隊(duì)列中元素的數(shù)據(jù)結(jié)構(gòu),如果未傳入默認(rèn)賦值空數(shù)組,傳入需先校驗(yàn)類型是否正確。頭等艙和商務(wù)艙乘客的優(yōu)先級(jí)要高于經(jīng)濟(jì)艙乘客。在有些國家,老年人和孕婦或帶小孩的婦女登機(jī)時(shí)也享有高于其他乘客的優(yōu)先級(jí)。 有一天,當(dāng)回顧自己走過的路時(shí),你會(huì)發(fā)現(xiàn)這些奮斗不息的歲月,才是最美好的人生。——弗洛伊德 隊(duì)列,英文 First In First Out 簡稱 FIFO,遵從先進(jìn)先出的原...

    galois 評(píng)論0 收藏0
  • Java集合_HashMap篇

    摘要:如果不重復(fù),判斷是否是類型,如果是紅黑樹,直接插入。條件為時(shí)執(zhí)行鏈表轉(zhuǎn)紅黑樹,然后插入。為了避免尾部遍歷。添加元素時(shí),如果超過閾值,就要進(jìn)行擴(kuò)容,如果兩個(gè)元素同時(shí)添加,線程和線程可能同時(shí)擴(kuò)容。 1.HashMap結(jié)構(gòu) ????HashMap是存鍵值對(duì)(key-value)映射的數(shù)據(jù)結(jié)構(gòu),由數(shù)組+鏈表組成的,數(shù)組是HashMap的主體,鏈表則是主要為了解決哈希沖突而存在的,如果定位到的數(shù)...

    MoAir 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<