牛客網演算法筆記 完美洗牌問題

2021-08-09 12:28:57 字數 799 閱讀 9756

引用【左神】

【問題描述】

假設有長度為2*n的陣列[a1,a2,a3,.......,an,b1,b2,b3,......bn],洗牌後的順序為[b1,a1,b2,a2,......,bn,an],要求:空間複雜度為o(n),時間複雜度為o(1)。

【問題分析】

在考慮空間和時間複雜度的情況下,該題目室友難度的。左神講解的座標連環懟方法我覺得很有意思,解決技巧也很高。

首先我們來舉例說明一下什麼是座標連環懟。

兩個陣列a[1,2,3,4],b[a,b,c,d]。理應結果c[a,1,b,2,c,3,d,4]

畫**釋一下。序號1

2345

678開始前12

34ab

cd開始後a1b

2c3d

4 座標連環懟的意思呢就是1佔了2的位置,2佔了4的位置,4佔了d的位置,d佔了c的位置,c佔了a的位置,a佔了1的位置

由此由序號可得到乙個環,1-2-4-8-7-5-1

我們發現還有兩個位置沒有佔,那就是3,6,那第二個環就是3-6-3

在這裡我們說明一下換的個數依賴於陣列的長度,2n=(3^k-1),k值為換的個數。當陣列的長度與(3^k-1)不相等是,想辦法將陣列劃分為幾個((3^k-1))組合的形式,分別進行座標連環懟。已經知道第乙個座標,求下乙個懟的座標為(2*i)%(2n+1)

比如說我知道我要從第乙個座標開始懟  ,那麼第二個座標為2,第三個座標為4。

對於完美洗牌問題,我只能理解到這裡,**還不會寫。有大神會寫的可以分享在這裡。如果想要更加詳細的理解完美洗牌問題,推薦

牛客網 洗牌問題

問題描述 洗牌在生活中十分常見,現在需要寫乙個程式模擬洗牌的過程。現在需要洗2n張牌,從上到下依次是第1張,第2張,第3張一直到第2n張。首先,我們把這2n張牌分成兩堆,左手拿著第1張到第n張 上半堆 右手拿 著第n 1張到第2n張 下半堆 接著就開始洗牌的過程,先放下右手的最後一張牌,再放下左手的...

牛客網做題筆記 洗牌問題

洗牌在生活中十分常見,現在需要寫乙個程式模擬洗牌的過程。現在需要洗2n張牌,從上到下依次是第1張,第2張,第3張一直到第2n張。首先,我們把這2n張牌分成兩堆,左手拿著第1張到第n張 上半堆 右手拿著第n 1張到第2n張 下半堆 接著就開始洗牌的過程,先放下右手的最後一張牌,再放下左手的最後一張牌,...

牛客網演算法筆記 分糖果問題

左神 問題描述 基礎 1.每個孩子不管得分多少,最少分到乙個糖果。2.任意兩個相鄰的孩子之間,得分較多的孩子必須拿多一些的糖果 根據左講解的坡度我們來理解一下。見下圖 大概思想應該是這樣。我拷貝的別人的,圖是我自己理解的。可以複製 看一看。public class problem 07 candyp...