简单记录以下本周刷题用到的C++知识点和算法。
知识点一:异或算法 ⨁ \bigoplus ⨁
概念
参与运算的两个值,如果两个相应位相同,则结果为0,否则为1,C++运算符号为 ^
比如
0^ 0=0, 1^ 0=1, 0^ 1=1, 1^1=0
性质
1.任何数和 0 做异或运算,结果仍然是原来的数,即 a ⊕ 0 = a a \oplus 0=a a⊕0=a。
2.任何数和其自身做异或运算,结果是 0,即 a ⊕ a = 0 a \oplus a=0 a⊕a=0。
3.异或运算满足交换律和结合律,即
a ⊕ b ⊕ a = b ⊕ a ⊕ a = b ⊕ ( a ⊕ a ) = b ⊕ 0 = b a \oplus b \oplus a=b \oplus a \oplus a=b \oplus (a \oplus a)=b \oplus0=b a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b
基于以上性质,看题目leetcode136
可以通过异或运算给定的数组中的每一个元素,元素个数为2时,异或运算( ⊕ \oplus ⊕)得到结果为0
0与每一个元素进行异或运算结果为0,所以最终结果只剩下个数为1的元素。
知识点二: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>
\\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。
用法
常用的用法
1.push_back()在数组的最后添加一个数据
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为偶数时,中间数是 下标 ( 0 + n 2 − 1 ) 、 ( 0 + n 2 ) (\frac{0+n}{2}-1)、(\frac{0+n}{2}) (20+n−1)、(20+n)两者之和的平均值;
**(2)**n为奇数时,中间数是下标 n + 1 2 \frac{n+1}{2} 2n+1的值。
例题:leetcode4
用法
时间复杂度:O( n ln ( n ) n\ln(n) nln(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;}
}
}