leetcode 解題報告(21 28)

2021-09-24 19:40:53 字數 4322 閱讀 2469

題目描述:合併兩個有序鍊錶

解題思路:水題

# definition for singly-linked list.

# class listnode(object):

# def __init__(self, x):

# self.val = x

# self.next = none

class

solution

(object):

defmergetwolists

(self, l1, l2)

:"""

:type l1: listnode

:type l2: listnode

:rtype: listnode

"""ans =

none

new =

none

while l1 or l2:

ifnot l1:

ifnot new:

new = listnode(0)

ans = new

else

: new.

next

= listnode(0)

new = new.

next

new.val = l2.val

l2 = l2.

next

elif

not l2:

ifnot new:

new = listnode(0)

ans = new

else

: new.

next

= listnode(0)

new = new.

next

new.val = l1.val

l1 = l1.

next

elif

not l1 and

not l2:

return new

elif l1.val >= l2.val:

ifnot new:

new = listnode(0)

ans = new

else

: new.

next

= listnode(0)

new = new.

next

new.val = l2.val

l2 = l2.

next

elif l1.val < l2.val:

ifnot new:

new = listnode(0)

ans = new

else

: new.

next

= listnode(0)

new = new.

next

new.val = l1.val

l1 = l1.

next

return ans

題目描述:合併k個有序鍊錶

解題思路:比較難,剛開始用合併兩個有序陣列的方法來做,果斷超時,做了太多的重複計算。後來看到有人說優先佇列,於是只要知道優先佇列就很簡單了,然後去看了一下stl的priority_queue,**就很好寫了,用優先佇列儲存每個鍊錶的當前位置,然後就出隊進隊就行了。

class solution };

listnode*

mergeklists

(vector>

& lists)

else

if(tmp->next)

que.

push

(tmp->next);}

return head;}}

;

題目描述:把鍊錶的每兩個元素調換個位置

解題思路:水題,指標注意好就行了

class solution };

listnode*

mergeklists

(vector>

& lists)

else

if(tmp->next)

que.

push

(tmp->next);}

return head;}}

;

解題思路:難點就在於掌握好每個指標,每組的隊首隊尾都要記錄,還要記錄上一組的隊尾,然後就按照倒置一條鍊錶的思路,用頭插法倒置k個節點,再把當前組和上一組串起來。只要注意好每個指標,思路其實很簡單,花了乙個兩個小時,才順利寫好修改指標的**。

/**

* definition for singly-linked list.

* struct listnode

* };

*/class solution

if(cnt == k && end)

else

return head;

while

(end)

fst = end;

mid = end;

int tmp =1;

while

(end && tmp < k)

if(tmp == k && end)

end = mid->next;

else}}

if(grp == head)

head = fst;

else

return head;}}

;

題目描述:移除陣列重複元素

解題思路:水題

class solution 

}return i+1;

}};

題目描述:給定乙個陣列和乙個值k,移除陣列中所有的k

解題思路:水題

class

solution

(object):

defremoveelement

(self, nums, val)

:"""

:type nums: list[int]

:type val: int

:rtype: int

"""length =

len(nums)

-nums.count(val)

while val in nums:

nums.remove(val)

return length

題目描述:定位模式串在正文中的位置

解題思路:kmp入門題

class

solution

(object):

defstrstr

(self, haystack, needle)

:"""

:type haystack: str

:type needle: str

:rtype: int

"""ifnot needle:

return

0 next_ =[0

,0] p =

0for i in

range(1

,len

(needle)):

p = next_[i]

while p and needle[p]

!= needle[i]

: p = next_[p]

if needle[p]

== needle[i]1)

else0)

# print(next_)

p =0for i in

range

(len

(haystack)):

while p and needle[p]

!= haystack[i]

: p = next_[p]

if needle[p]

== haystack[i]

: p +=

1if p ==

len(needle)

:return i-p+

1return

-1

Leetcode 33 解題報告

leetcode 33 解題報告 對於排序之後的資料結構,二分查詢是不二法則。本題的關鍵就在於如何針對旋轉之後的排序陣列進行二分查詢。考慮到陣列中沒有重複元素 注意這一前提十分關鍵 可以提供兩種思路 1 兩次二分查詢 第一次二分查詢的目標是找出陣列具體在哪個位置做了旋轉,這個可以簡單地通過比較num...

LeetCode50 Pow x, n 解題報告

題目的意思是實現乙個pow 函式。input 2.00000,10 output 1024.00000這裡用的是遞迴的辦法,能夠降低時間複雜度,不過需要對n進行奇數,偶數進行判斷,用了 0x1進行判斷,當判斷n為奇數的時候,乘上x。如下 class solution bool flag false ...

LeetCode 1 Two Sum 解題報告

題意 陣列nums中,有兩個元素的和是target,找出這兩個元素的位置。思路 維護乙個map,用陣列的元素的值做key,用元素的位置做value。遍歷nums,對每個num來說,如果map target num 有值的話,就返回map target num 和num的位置,如果沒有找到的話,就把n...