TLP Task01學習筆記

2021-10-14 12:39:37 字數 4058 閱讀 9378

004 尋找兩個正序陣列的中位數

005 最長回文子串

本篇為datawhale組隊學習計畫第21期leetcode精選題目組task01學習筆記。

初學,時間有點倉促,很多解法沒有詳細分析,未來會修改,見諒。

給出兩個非空的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照逆序的方式儲存的,並且它們的每個節點只能儲存一位數字。

請你將兩個數相加,並以相同形式返回乙個表示和的鍊錶。

你可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。

提示

每個鍊錶中的節點數在範圍 [1, 100] 內

0 <= node.val <= 9

題目資料保證列表表示的數字不含前導零

示例:

輸入:l1 = [2,4,3], l2 = [5,6,4]

輸出:[7,0,8]

解釋:342 + 465 = 807.

輸入:l1 = [0], l2 = [0]

輸出:[0]

輸入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]

輸出:[8,9,9,9,0,0,0,1]

兩數相加,主要考慮鍊錶長度對齊(遍歷)和進製的問題。

基本思路:遍歷,將相同位置的節點值相加;滿十進位,加到新的一位去。

# definition for singly-linked list.

# class listnode:

# def __init__(self, val=0, next=none):

# self.val = val

# self.next = next

class

solution

:def

addtwonumbers

(self, l1: listnode, l2: listnode)

-> listnode:

dummy = listnode(

) cur, count = dummy,

0while l1 or l2:

if l1:

# l1不為空

count += l1.val #節點值加和

l1 = l1.

next

#更新if l2:

count, l2 = count + l2.val, l2.

next

cur.

next

= listnode(count %10)

#取餘數操作,更新鍊錶

cur,count = cur.

next

, count //

10if count !=0:

cur.

next

= listnode(count)

return dummy.

next

執行用時68ms。後續優化主要在遍歷方法方向。

參考:

給定兩個大小為 m 和 n 的正序(從小到大)陣列 nums1 和 nums2。請你找出並返回這兩個正序陣列的中位數。

高階:你能設計乙個時間複雜度為 o(log (m+n)) 的演算法解決此問題嗎?

示例

輸入:nums1 = [1,3], nums2 = [2]  輸出:2.00000 

解釋:合併陣列 = [1,2,3] ,中位數 2

輸入:nums1 = [1,2], nums2 = [3,4] 輸出:2.50000

解釋:合併陣列 = [1,2,3,4] ,中位數 (2 + 3) / 2 = 2.5

輸入:nums1 = [0,0], nums2 = [0,0] 輸出:0.00000

輸入:nums1 = , nums2 = [1] 輸出:1.00000

提示

nums1.length == m

nums2.length == n

0 <= m <= 1000

0 <= n <= 1000

1 <= m + n <= 2000

-106 <= nums1[i], nums2[i] <= 106

個人推薦leetcode題解,可以把常見的思路都了解一下。

題目要求時間複雜度o(log (m+n)),又是有序陣列,想到採用二分法解題(二分法總是搭配有序陣列,遇到時都可以考慮能不能使用)。

陣列長度2k或2k-1,求第k小的數字,第一篇題解中操作方法說得很詳細。

不斷對比兩數列的第k/2個數,若a數列的第k/2個數小於b數列的,說明a數列前面幾項都小於所需數,全部排除。不斷更新k,依此類推。

注意考慮陣列長度不到k/2的問題:

每次比較 min(k/2,len(陣列) 對應的數字,把小的那個對應的陣列的數字排除,將兩個新陣列進入遞迴,並且 k

要減去排除的數字的個數。遞迴出口就是當 k=1 或者其中乙個數字長度是 0 了。

585372

這篇**注釋比較詳細,結合本篇題解看就足夠了。感覺自己再解釋也不如直接看原文來得好。個人想等二分法這裡攢幾道題可以做乙個專題。

新增#來避免奇偶個數問題,採用切割的策略可進一步降低複雜度。

給你乙個字串 s,找到 s 中最長的回文子串。

示例

輸入:s = "babad" 輸出:"bab"

解釋:"aba" 同樣是符合題意的答案。

輸入:s = "cbbd" 輸出:"bb"

輸入:s = "a" 輸出:"a"

輸入:s = "ac" 輸出:"a"

1 <= s.length <= 1000

s 僅由數字和英文本母(大寫和/或小寫)組成

學習文件中主要介紹了暴力法和動態規劃兩種。暴力法時間複雜度o(n^3),就一直超時。動態規劃與回文通常是搭配的。(但來不及寫了就只能先放乙個暴力在這裡)

****及參考:

class

solution

:def

longestpalindrome

(self, s:

str)

->

str:

size =

len(s)

if size <2:

return s #乙個字元時直接輸出

max_len, res =

1, s[0]

# 列舉所有長度大於等於 2 的子串

#左、右邊界,驗證回文串,都與整個陣列有關,導致時間複雜度o(n^3)

for i in

range

(size -1)

:for j in

range

(i +

1, size)

:if j - i +

1> max_len and self.__valid(s, i, j)

: max_len,res = j - i +

1,s[i:j +1]

return res

def__valid

(self, s, left, right)

:# 驗證子串 s[left, right] 是否為回文串

while left < right:

if s[left]

!= s[right]

:return

false

left +=

1 right -=

1return

true

TLP Task14學習筆記

217 存在重複元素 230 二叉樹搜尋樹中最小的元素 本篇為datawhale組隊學習計畫第21期leetcode精選題目組task14學習筆記。初學,時間有點倉促,很多解法沒有詳細分析,未來可能會修改,見諒。datawhale學習文件 在未排序的陣列中找到第 k 個最大的元素。請注意,你需要找的...

學習筆記 01

在網上搜尋了一些資料,由於不知道哪些入門容易,所以先看看找到的資料,也對.net有個初步了解。將資料作了個整理 net framework 執行環境 visual studio net 開發工具 microsoft windows server 2003 企業伺服器 microsoft office...

學習筆記 CentOS 學習筆記01

簡單的做個課堂筆記 虛擬機器用的是vmware,系統是centos cd etc sysconfig network scripts pwdls 顯示列表 cat ifcfg eth0 檢視檔案內容 vi ifcfg eth0 進入vi編輯器 onboot no 原始設定 x逐字刪除 d刪除整行 a...