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,這剛好是異或計算 對於進製,正好是按位與 左移一位之後的結果 在將兩者進行異或,之後再計算進製,直到沒有進製,完成運算,同樣有兩種實現...