leetcode刷題第一天

2021-10-14 09:25:02 字數 3748 閱讀 7254

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

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

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

class

solution

:def

addtwonumbers

(self, l1: listnode, l2: listnode)

-> listnode:

dummy = p = listnode(

none

)#儲存頭結點,返回結果

s =0#每一步的求和暫存變數

while l1 or l2 or s:

#迴圈條件:l1 或者l2(沒有遍歷完成),s(進製)不為0

s +=

(l1.val if l1 else0)

+(l2.val if l2 else0)

#這其實是好多**,我自己寫了好多行,但是作者這樣寫非常簡潔,贊

p.next

= listnode(s %10)

#構建新的list儲存結果,其實用較長的加數鍊錶存也可以,%10:求個位

p = p.

next

s //=

10#求進製

l1 = l1.

next

if l1 else

none

l2 = l2.

next

if l2 else

none

return dummy.

next`在這裡插入**片

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

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

示例 1:

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

輸出:2.00000

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

示例 2:

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

輸出:2.50000

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

先找第k個小數

找第k小數

對於兩個有序陣列,我們要找第k小的數

由於時間復制度要求是log,所以自然的想法就是對兩個陣列每次切一半。

好,假設我們取兩個陣列k/

2位置上的數(這裡暫時不考慮上溢)

如果nums1[k/2]

>=nums2[k/

2],這意味著:

nums2陣列的左半邊都不需要考慮了,因為肯定會比第k小的數要來得小。

所以我們可以切掉nums2陣列的一半,如此遞迴,每次都能切走一半

自然能達到o(log(m+n))複雜度的要求了。

在具體的**實現中,為了方便處理邊界情況,

我們可以令nums1始終是長的那個陣列,

然後令t =

min(k//2,

len(nums2)

)便可以防止上溢的發生。

defhelper

(nums1,nums2,k):if

(len

(nums1)

<

len(nums2)):

nums1, nums2 = nums2 , nums1 #保持nums1比較長if(

len(nums2)==0

):return nums1[k-1]

# 短陣列空,直接返回

if(k==1)

:return

min(nums1[0]

,nums2[0]

)#找最小數,比較陣列首位

t =min(k//2,

len(nums2)

)# 保證不上溢

if( nums1[t-1]

>=nums2[t-1]

):return helper(nums1 , nums2[t:

],k-t)

else

:return helper(nums1[t:

],nums2,k-t)

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

示例 1:

輸入:s = 「babad」

輸出:「bab」

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

示例 2:

輸入:s = 「cbbd」

輸出:「bb」

示例 3:

輸入:s = 「a」

輸出:「a」

動態規劃

思路與演算法

對於乙個子串而言,如果它是回文串,並且長度大於 22,那麼將它首尾的兩個字母去除之後,它仍然是個回文串。例如對於字串 \textrm「ababa」,如果我們已經知道 \textrm「bab」 是回文串,那麼 \textrm「ababa」 一定是回文串,這是因為它的首尾兩個字母都是 \textrm「a」。

根據這樣的思路,我們就可以用動態規劃的方法解決本題。我們用 p(i,j)p(i,j) 表示字串 ss 的第 ii 到 jj 個字母組成的串(下文表示成 s[i:j]s[i:j])是否為回文串:

p(i,j) = \begin \text &\quad\text s_i \dots s_j \text\ \text &\quad\text \end

p(i,j)= p(i, i) = \text \ p(i, i+1) = ( s_i == s_ ) \end

p(i,j)=true 中 j-i+1j−i+1(即子串長度)的最大值。注意:在狀態轉移方程中,我們是從長度較短的字串向長度較長的字串進行轉移的,因此一定要注意動態規劃的迴圈順序。

class

solution

:def

longestpalindrome

(self, s:

str)

->

str:

n =len(s)

dp =[[

false

]* n for _ in

range

(n)]

ans =

""# 列舉子串的長度 l+1

for l in

range

(n):

# 列舉子串的起始位置 i,這樣可以通過 j=i+l 得到子串的結束位置

for i in

range

(n):

j = i + l

if j >=

len(s)

:break

if l ==0:

dp[i]

[j]=

true

elif l ==1:

dp[i]

[j]=

(s[i]

== s[j]

)else

: dp[i]

[j]=

(dp[i +1]

[j -1]

and s[i]

== s[j]

)if dp[i]

[j]and l +

1>

len(ans)

: ans = s[i:j+1]

return ans

leetcode刷題筆記 第一天

題目說明 給定乙個 haystack 字串和乙個 needle 字串,在 haystack 字串中找出 needle 字串出現的第乙個位置 從0開始 如果不存在,則返回 1。解題思路 首先判斷needle是否在haystack中,如果存在則返還needle所在位置。如果不存在,則返還 1。def s...

第一天刷題

給出兩個非空的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照逆序的方式儲存的,並且它們的每個節點只能儲存一位數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例1 輸入 l1 2 4,3 l2 5 6,4 輸出...

刷leetcode的第一天

1 類和例項 類是抽象的模板 例是根據類建立出來的乙個個具體的 物件 例 class student object bart student bart main.student object at 0x10a67a590 0x10a67a590是個記憶體位址 student bart是個變數 stu...