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

简单记录以下本周刷题用到的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 a0=a
2.任何数和其自身做异或运算,结果是 0,即 a ⊕ a = 0 a \oplus a=0 aa=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 aba=baa=b(aa)=b0=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为偶数时,中间数是 下标 ( 0 + n 2 − 1 ) 、 ( 0 + n 2 ) (\frac{0+n}{2}-1)、(\frac{0+n}{2}) (20+n1)(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;}
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_44794443/article/details/112998868
今日推荐