leetcode面試試題 兩個陣列的交集

2021-10-10 04:29:10 字數 1595 閱讀 4226

leetcode面試題 前言

一、題目描述

二、解決方法

總結leetcode 練習

題目:給定兩個陣列,編寫乙個函式來計算它們的交集。

示例 1:

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

輸出:[2]

示例 2:

輸入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]

輸出:[9,4]

**方法1:**從nums1中乙個個挑出值來與nums2中乙個個進行對比,挑出其中共有的元素。然而挑出來的元素組成的陣列中會有重複。如果不考慮重複情況的話,示例一會輸出四個2。考慮重複的話則需要將vector變為set集合,因為集合是不允許出現有相同元素的。

set<

int>

s(dd.

begin()

, dd.

end())

; dd.

assign

(s.begin()

, s.

end())

;

但是這樣時間複雜度為o(mn)

方法一的改進,可以通過雜湊集合儲存元素,通過set.count()則可以在o(1) 的時間內判斷乙個元素是否在集合中,從而降低時間複雜度。

for

(auto

& num : set1)

}

時間複雜度為o(m+n)。

1、首先對兩個陣列通過sort函式進行排序。

2、設定兩個指標分別指向兩個陣列的頭。

3、一開始設定乙個preview值與其中乙個陣列的頭元素相等。

4、然後通過兩個指針對兩個陣列的元素進行一一比較,不相等時,數值較小的那一方,指標+1。相等時且不等於preview值時,將這乙個值加入到新的陣列當中,然後更新preview。如果等於preview值時,兩個指標都+1。

5、重複迴圈直到有一方的陣列的長度到了盡頭,就取消迴圈。

vector<

int> intersection;

while

(index1 < length1 && index2 < length2)

index1++

; index2++;}

else

if(num1 < num2)

else

}

時間複雜度:o(m \log m+n \log n)o(mlogm+nlogn),其中 mm 和 nn 分別是兩個陣列的長度。對兩個陣列排序的時間複雜度分別是 o(m \log m)o(mlogm) 和 o(n \log n)o(nlogn),雙指標尋找交集元素的時間複雜度是 o(m+n)o(m+n),因此總時間複雜度是 o(m \log m+n \log n)o(mlogm+nlogn)。

空間複雜度:o(\log m+\log n)o(logm+logn),其中 mm 和 nn 分別是兩個陣列的長度。空間複雜度主要取決於排序使用的額外空間。

1、c++中vector的用法。vector的各種用法

2、c++中set的幾種用法

3、雙指標的用法

微軟面試試題

part i.選擇題 70分鐘 1.求函式返回值,輸入x 9999 int func x return countx 2.為什麼返回區域性變數的引用不好?a,b,c,d不記得了,大概和記憶體,返回值等等有關。3.stack r,from the top to bottom 逐個取出放入queue q...

兩個面試題

1.實現乙個lite版的字串替換函式 c c char strreplace char str,const char sub,const char rep 限制條件和要求如下 1.其中str為原字串,sub為待被替換的子串。為簡單起見,假定字串sub和rep長度一樣 2.直接對原字串str進行修改並...

面試題 實現兩個數的和,不能用「 」「 」

這道題目和之前leetcode中的二進位制加法很相似。由於無法使用運算子,我們可以改用對位的操作。如果不考慮進製的話 1 1 0,1 0 1,0 1 1,0 0 0,這剛好是異或計算 對於進製,正好是按位與 左移一位之後的結果 在將兩者進行異或,之後再計算進製,直到沒有進製,完成運算,同樣有兩種實現...