本題來自於官方編輯的初級演算法中陣列分類下的乙個題目。先看一下題目描述。
首先先將陣列排序,然後將指標分別指向兩個陣列第乙個元素,對兩個陣列進行遍歷。遍歷過程有三種情況:
nums1的元素等於nums2的元素,那麼說明這個數是交集的元素之一,放入交集陣列中。
nums1的元素小於nums2的元素,就將指向nums1的指標後移一位。
nums1的元素大於nums2的元素,就將指向nums2的指標後移一位。
class
solution
:def
intersect
(self, nums1: list[
int]
, nums2: list[
int])-
> list[
int]
: intersection =
nums1.sort(
) nums2.sort(
) m,n =
len(nums1)
,len
(nums2)
i,j =0,
0while
(i:if nums1[i]
== nums2[j]:)
i = i+
1 j = j+
1elif nums1[i]
< nums2[j]
: i = i+
1else
: j = j+
1return intersection
這就是雙指標方法,實現起來也比較簡單。另外官方還有一種使用雜湊表的方法。
先將較短的陣列的元素做乙個計數,對映到雜湊表中,雜湊表中是每個元素的出現次數。接著遍歷另乙個陣列,如果雜湊表中存在這個陣列中的元素,那麼就把元素加入到結果陣列中,然後雜湊錶值減1,當值為0時刪除這個元素。
class
solution
:def
intersect
(self, nums1: list[
int]
, nums2: list[
int])-
> list[
int]:if
len(nums1)
>
len(nums2)
:return self.intersect(nums2, nums1)
m = collections.counter(
)for num in nums1:
m[num]+=1
intersection =
list()
for num in nums2:
if(count :
= m.get(num,0)
)>0:
m[num]-=1
if m[num]==0
: m.pop(num)
return intersection
前面兩行剛開始我還以為是個遞迴,仔細一看原來只是為了找出比較短的陣列。又學到了乙個小技巧。 leetcode刷題 021合併兩個有序鍊錶
將兩個有序鍊錶合併為乙個新的有序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。示例 輸入 1 2 4,1 3 4 輸出 1 1 2 3 4 4 definition for singly linked list.class listnode def init self,x self.v...
leetcode刷題之旅 21 合併兩個有序鍊錶
definition for singly linked list.struct listnode listnode int x val x next nullptr listnode int x,listnode next val x next next class solution cur ne...
LeetCode刷題日記 21 合併兩個有序鍊錶
今天是開始刷leetcode的第一天,看到題目還幾乎沒有思路。準備先從鍊錶題開始刷。先看答案,然後根據答案掌握c 鍊錶相關用法。根據課程,寫下以下暴力解 definition for singly linked list.struct listnode listnode int x val x ne...