简单记录以下本周刷题用到的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((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;}
	}
}
内容来源于网络如有侵权请私信删除

文章来源: 博客园

原文链接: https://www.cnblogs.com/czy-stu/p/14314860.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!

相关课程