第一週(2021/01/18~24)

簡單記錄如下本週刷題用到的C++知識點和算法。html

知識點一:異或算法 \(\bigoplus\)

概念

參與運算的兩個值,若是兩個相應位相同,則結果爲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

知識點二:C++ STL 之哈希表(unordered_map)

引用博客C++ STL 之哈希表 | unordered_map算法

概述

哈希表是根據關鍵碼值(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')

知識點三:vector<>容器

引用博客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;}
	}
}
相關文章
相關標籤/搜索