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

简单记录以下本周刷题用到的C++知识点和算法。

知识点一:异或算法 \(\bigoplus\)

概念

参与运算的两个值,如果两个相应位相同,则结果为0,否则为1,C++运算符号为 ^
比如
0^ 0=0, 1^ 0=1, 0^ 1=1, 1^1=0

性质

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的元素。

知识点二: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>

\\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为偶数时,中间数是 下标\((\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;}
	}
}
posted @ 2021-01-25 09:44  czya  阅读(96)  评论(0编辑  收藏  举报