查詢,是使用計算機處理問題時的乙個最基本的任務,因此也是面試中非常常見的一類問題。很多演算法問題的本質,就是要能夠高效查詢。學會使用系統庫中的map和set,就已經成功了一半。
// 349. intersection of two arrays
// 時間複雜度:o(nlogn)
// 空間複雜度:o(n)
class
solution
};改寫程式:
// 349. intersection of two arrays
class
solution
};複製**
// 350. intersection of two arrays ii
// 時間複雜度:o(nlogn)
// 空間複雜度:o(n)
class
solution
return resultvector;}};
複製**
思考
雜湊表不管查詢、插入、刪除都是o(1)的時間複雜度。
#include
using
namespace
std;
// 349. intersection of two arrays
// 時間複雜度:o(n)
// 空間複雜度:o(n)
class
solution
};//改寫過使用hash表實現底層的unorder_map
#include
using
namespace
std;
/// 350. intersection of two arrays ii
// 時間複雜度:o(n)
// 空間複雜度:o(n)
class
solution
// o(n)
return resultvector;}};
複製**
anagram:乙個字串中的字母調整順序後與原字串一致。
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
複製**
給出乙個模式(pattern)以及乙個字串,判斷這個字串是否符合模式?
如pattern=「abba」,str=「dog cat cat dog」,返回true
如pattern=「abba」,str=「dog cat cat fish」,返回false
字符集?
空串符合任意模式?還是不符合任意模式?
複製**
判斷兩個字串是否同構?如果我們能夠尋找到乙個字符集到字符集的對映,使得通過這個字符集的對映,s可以轉變為t,則稱為s和t同構。
如 egg 和 add,返回true
如 foo 和 bar,返回false
如 ***** 和 title,返回true
複製**
注意
給定乙個字串,按照字母出現頻率的倒序重組整個字串
如「tree」,返回「eert」
如「cccaaa」,返回「cccaaa」
如「aabb」,返回「bbaa」
對於相同頻次的字母,順序任意。大小寫敏感。
複製**
注意
暴力解法:o(n^2)
雙索引對撞
使用查詢表
//時間複雜度:o(n)
//空間複雜度:o(n)
class solution ;
return vector(res, res + 2);
}record[nums[i]] = i;
}throw invalid_argument("the input has no solution");}};
複製**
leetcode15 3sum給出乙個整形陣列,尋找其中的所有不同的三元組(a,b,c),使得a+b+c=0leetcode18 4sum如 nums = [-1, 0, 1, 2, -1, -4]
結果為[ [-1, 0, 1], [-1,-1,2] ]
給出乙個整形陣列,尋找其中的所有不同的四元組(a,b,c,d),使得a+b+c+d 等於乙個給定的數字target。leetcode16 3sum closest如 nums = [1, 0, -1, 0, -2, 2],target = 0
結果為[ [-1, 0, 0, 1], [-2, -1, 1, 2], [-2, 0, 0, 2] ]
給出乙個整形陣列,尋找其中的三個元素a,b,c,使得a+b+c的值最接近另外乙個給定的數字target
如 nums = [-1, 2, 1, -4],target = 1
結果為2 ( -1 + 2 + 1 = 2 )
複製**
注意
暴力解法:o(n^4)
500^4 = 625,0000,0000
將d中的元素放入查詢表:o(n^3)
500^3 = 1,2500,0000
將c+d的每一種可能放入查詢表:o(n^2)
**實現:
//時間複雜度o(n^2)
//空間複雜度o(n^2)
class solution
};複製**
思考
給出乙個字串陣列,將其中所有可以通過顛倒字元順序產生相同結果的單詞進行分組。
如 [ 「eat」, 「tea」, 「tan」, 「ate」, 「nat」, 「bat」]
返回[ [「ate」, 「eat」, 「tea」], [「nat」, 「tan」], [「bat」] ]
複製**
注意
暴力解法:o(n^3)
//時間複雜度:o(n^2)
//空間複雜度:o(n)
class solution
return res;
}private:
int dis( const pair&pa, const pair&pb)
};複製**
leetcode149 max points on a line給出2d平面上的n個點,求出最多有多少個點在一條直線上?
// 時間複雜度: o(n)
// 空間複雜度: o(k)
class solution
return
false;}};
複製**
給出乙個整形陣列,若陣列中存在相同的元素,則返回true,否則返回false.
維持滑動窗的大小為k 遍歷每乙個元素,在活動視窗中尋找|v-nums[i]| < t, 即視窗中的元素範圍為:[v-t...v+t]之間。採用ceil和floor可以實現
// 時間複雜度: o(nlogn)
// 空間複雜度: o(k)
class solution
return
false;}};
複製**
-------------------------華麗的分割線--------------------
看完的朋友可以點個喜歡/關注,您的支援是對我最大的鼓勵。
個人部落格番茄技術小棧和掘金主頁
leetcode 02 03 鍊錶問題題解
題目描述 解法一 逐一比較,取出較小的。定義兩個指標,創造新鍊錶的頭節點,讓其分別只想兩個鍊錶,比較其大小取出較小的那個值,讓其等於新鍊錶的結點。這種解法是創造了新鍊錶,並沒有充分利用鍊錶的特性。listnode mergetwolists listnode l1,listnode l2 if te...
LeetCode 查詢 查詢表
元素 a 是否存在,通常用set 集合 set只儲存鍵,而不需要對應其相應的值。set中的鍵不允許重複 元素 a 出現了幾次 dict 字典 dict中的鍵不允許重複 通過將原有序列的關係對映統一表示為其他 演算法應用 leetcode 349 intersection of two arrays ...
leetcode題解(陣列問題)
面試中的演算法問題,有很多並不需要複雜的資料結構支撐。就是用陣列,就能考察出很多東西了。其實,經典的排序問題,二分搜尋等等問題,就是在陣列這種最基礎的結構中處理問題的,今天主要學習常見的陣列中處理問題的方法。template intbinarysearch t arr,int n,t target ...