支線任務 1

2022-08-24 01:54:13 字數 2118 閱讀 5232

題目:leetcode no. 234 palindrome linked list(回文鍊錶)

題目大意:

給定乙個單向鍊錶,試確定它是不是乙個回文鍊錶。

以及要求使用o(n)的時間複雜度以及o(1)的空間複雜度。

其實就回文這個問題來說,可以有一萬種題目來難道很多人(比如最長回文子串,公共最長回文子串之類的問題)。

不過如果只是像本題這樣判斷是不是回文的話應該算是非常容易的一件事情。

而題目要求的o(1)的額外空間複雜度也沒什麼難事,因為真正在比較的時候無非也就需要兩個游標。但這就又要求兩個游標要對稱的前進,也就是說單向鍊錶是做不到的。這也就很自然的帶出了我們的想法——讓一半的節點的指向反轉,所以直接了斷的說,這個題目實際上是個反轉鍊錶的題目。

大致就是將上圖的上面的鍊錶改成下面的樣子,然後通過從最中間的兩個節點(如果一共有奇數個節點的話其實最中間的乙個可以不考慮,然後就變成偶數個了)向兩側同時遍歷來判斷。

由於整個演算法每一步都是線性的,所以o(n)的時間複雜度和o(1)的空間複雜度都已經滿足了。那麼接下來的問題就是如何將常數最優化

我的方法是在第一遍遍歷的同時設定兩個游標,其中乙個是另外乙個速度的一半,前面的游標一直走到結束為止,這樣可以知道一共多少個節點;後面的游標每經過乙個節點就改變那個節點的指向方向

這樣在第乙個游標結束的時候第二個游標正好會在正中間(如果是奇數個還需要再進一步)並且同時整個鍊錶也反轉成適當的樣子了,這樣只需第二遍遍歷就可以出結果了,這樣算來常數大約是2.5倍。事實證明這樣的演算法在所有ac程式中也是最快的之一(當然由於伺服器壓力大不穩定所以每次測出來時間都可能會有略微的不同)。

下面附上程式

1

class

solution 20}

21 temp =second;

22 second = second->next;

23 temp->next =third;

24 third =temp;

25if (cnt & 1)26

29while (second !=null)

3035

else

3640}41

return

true;42

}43 };

那麼做完一道題是不是就完事了呢?並不是,我們要能夠舉一反三

下面給出幾個類似的題目(同樣是leetcode上的題目):

一:no. 143 reorder list

題目大意:給定單向鍊錶 l: l0→l1→…→l

n-1→ln,

要求將其重排: l0→l

n→l1→l

n-1→l2→l

n-2→…

解法:和這道題相似,也是要在遍歷的時候留乙個半速游標同步反轉,這樣在結束的時候得到兩個反向半個鍊錶然後重新遍歷連線。

二:no. 61 rotate list

題目大意:給定單向鍊錶鍊錶l: l0→l1→…→l

n-1→ln和正整數k,

要求將其重排為: lk+1→lk+2→…→ln→l1…→lk

解法:這個題目看似和反轉沒關係,但是可以通過將整個字串反轉再把兩段分別反轉得到結果。

三:no. 25 reverse node in k-groups

題目大意:將乙個鍊錶以k個為單位,每個單位分別反轉。如1->2->3->4->5->null, k == 2時會得到 2->1->4->3->5->null。

感興趣的同學可以自己去實現以下這幾道題目 : )

主線與支線

世上只有兩種路,主線路和支線路。並不存在所謂的彎路。人生區區數十光陰,不論怎麼走,都是完整人生。主線即為人的主要路線,包括主修技能,經營主要社會關係等。時間花在主線上,會帶給我們經驗 財富和社會地位。所有非主線都為支線。有的人沉於娛樂,也有的人無目的地不停換行業,雖然努力,也只能理解為在走支線。人從...

任務安排1

有 n 個任務排成乙個序列在一台機器上等待執行,它們的順序不得改變。機器會把這 n 個任務分成若干批,每一批包含連續的若干個任務。從時刻0開始,任務被分批加工,執行第 i 個任務所需的時間是 titi。另外,在每批任務開始前,機器需要 s 的啟動時間,故執行一批任務所需的時間是啟動時間 s 加上每個...

實驗任務1

include int main printf n printf 當遇到問題時,你會選擇 n printf 1.遇到問題,就解決問題。不懂的,搜尋式學習,逐個攻破.n printf 2.遇到問題,不高興。然後,沒有了.n printf 3.其它.n printf 你的選擇 scanf d answe...