LeetCode刷題 350兩個陣列的交集

2021-10-21 00:21:39 字數 1592 閱讀 9155

本題來自於官方編輯的初級演算法中陣列分類下的乙個題目。先看一下題目描述。

首先先將陣列排序,然後將指標分別指向兩個陣列第乙個元素,對兩個陣列進行遍歷。遍歷過程有三種情況:

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...