給你兩個 非空 的鍊錶,表示兩個非負的整數。它們每位數字都是按照 逆序 的方式儲存的,並且每個節點只能儲存 一位 數字。
請你將兩個數相加,並以相同形式返回乙個表示和的鍊錶。
你可以假設除了數字 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...