簡單記錄如下本週刷題用到的C++知識點和算法。html
參與運算的兩個值,若是兩個相應位相同,則結果爲0,不然爲1,C++運算符號爲 ^
好比
0^ 0=0, 1^ 0=1, 0^ 1=1, 1^1=0java
1.任何數和 0 作異或運算,結果仍然是原來的數,即 \(a \oplus 0=a\)。
2.任何數和其自身作異或運算,結果是 0,即 \(a \oplus a=0\)。
3.異或運算知足交換律和結合律,即
\(a \oplus b \oplus a=b \oplus a \oplus a=b \oplus (a \oplus a)=b \oplus0=b\)
基於以上性質,看題目leetcode136
能夠經過異或運算給定的數組中的每個元素,元素個數爲2時,異或運算(\(\oplus\))獲得結果爲0
0與每個元素進行異或運算結果爲0,因此最終結果只剩下個數爲1的元素。python
哈希表是根據關鍵碼值(key value)而直接進行訪問的數據結構。也就是說,它經過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度,這個映射函數叫作散列函數。
template:key和T是必需要有的,分別對應hashmap中的鍵和值數組
template < class Key, // unordered_map::key_type class T, // unordered_map::mapped_type class Hash = hash<Key>, // unordered_map::hasher class Pred = equal_to<Key>, // unordered_map::key_equal class Alloc = allocator< pair<const Key,T> > // unordered_map::allocator_type > class unordered_map;
STL中,map 對應的數據結構是 紅黑樹。紅黑樹是一種近似於平衡的二叉查找樹,裏面的數據是有序的。在紅黑樹上作查找操做的時間複雜度爲 O(logN)。
unordered_map 對應哈希表,哈希表的特色就是查找效率高,時間複雜度爲常數級別 O(1), 而額外空間複雜度則要高出許多。因此對於須要高效率查詢的狀況,使用 unordered_map 容器。而若是對內存大小比較敏感或者數據存儲要求有序的話,則能夠用 map 容器。unorder_map是無序的,因此在C++中一般使用指針來定位。數據結構
須要引入的頭文檔: <unordered_map>app
\\C++ \\初始化 std::unordered_map<std::string, std::string> map = {{"key","value"}}; \\插入元素 map['key']=value; /*map初始化時回分配很大的空間*/ \\移出元素 map.erase(map.begin()); /*參數:指向map的指針*/ \\清空元素 map.clear(); \\查找元素:經過key查找,存在則返回key對應的指針,不存在則返回指向map的最後一個單元+1的指針(map.end()) map.find('key')
引用博客C++ vector 容器淺析函數
能夠簡單的認爲,向量是一個可以存聽任意類型的動態數組,相似於java、python中的數組list。post
經常使用的用法
1.push_back()在數組的最後添加一個數據spa
2.pop_back()去掉數組的最後一個數據
3.size()當前使用數據的大小
4.reserve 改變當前vecotr所分配空間的大小,該方法沒有返回值 。
5.erase 刪除指針指向的數據項
6.empty 判斷vector是否爲空
7.clear 清空當前的vector
8.at()獲得編號位置的數據
9.begin()獲得數組頭的指針
10.end()獲得數組的最後一個單元+1的指針
11.front()獲得數組頭的引用
12.back()獲得數組的最後一個單元的引用
13.swap 與另外一個vector交換數據
二分查找應用於已經排序以後的數組,每次查找數組中間的數,與待查找的數已經比較大小。數組中間的數字的下標分爲如下兩種狀況:假設數組長度爲n;
(1) n爲偶數時,中間數是 下標\((\frac{0+n}{2}-1)、(\frac{0+n}{2})\)二者之和的平均值;
(2)n爲奇數時,中間數是下標\(\frac{n+1}{2}\)的值。
例題:leetcode4
時間複雜度:O(\(n\ln(n)\))
/* *C++代碼的實現 */ public binarySearch(vector<int> nums,int target) { int low = 0; int high = num.size(); int mid = (low+high)/2 while(low<=nums.size()-1&&high<=nums.size() &&low<=high) { mid = (low+high)/2 if(nums[mid]=target){return mid;} else if(nums[mid]<target){ low = mid+1; return low;} else{ high = mid-1; return high;} } }