【C++】leetcode竞赛笔记
*注——代码非博主本人所写,仅供学习参考,侵删
20200516双周赛:
1 to_string(int a) 将a转换成字符串形式
2 gcd(int a,int b) 返回a,b的最大公约数,若返回1则表示a/b不可再约分
3 string + 字符串可以直接用+号来连接
4 vector<vector<int> > vec(N, vector<int>(M));
建立[N][M]二维 数组
20200517周赛
1 split(const string &s, char stop) 把字符串s用stop分离
vector<string> split(const string &s, char stop){ vector<string> ret;string t; for (auto c : s)if(c == stop){ret.push_back(t);t = "";}else{t += c;} ret.push_back(t); return ret; }
2 isupper(char c) 判断c是否是大写字母
3 sort(a,b,cmp) 对数组进行排序a表示起始位置,b是结束位置,cmp是排序标准的函数
//利用数组a对数组v简介排序,a中储存v的下标,排序a,然后按照a中的先顺序输出v,可以保证v位置不变
sort(a.begin(), a.end(), [&](int i, int j){//匿名函数,[&]表示参数按引用捕获
//i表示排序后的位置在前的数,j表示排序后位置在后的数数 return v[i].size() < v[j].size() || v[i].size() == v[j].size() && i < j;//return 返回想要的结果
//v[i].size() < v[j].size() 要求前短后长
//v[i].size() == v[j].size() && i < j 要求前后通常的情况下,前面的 还是在前面(保持原来位置) } );
4 includes(bb.begin(),bb.end(),aa.begin(),aa.end()) 判断数组a是不是数组b的子集
int a[6]={1,2,3,4,5,9};
int b[7]={1,2,3,4,5,9,8};
vector<int> aa(a,a+6);
vector<int> bb(b,b+7);
sort(aa.begin(),aa.end());
sort(bb.begin(),bb.end());
bool f=includes(bb.begin(),bb.end(),aa.begin(),aa.end());
5 unordered_map查找复杂度O(n),普通map查找复杂度O(nlogn)
6 dfs,bfs的标记需要引用传参&,不能用形参
void fun(vector<vector<bool>>& bl,queue<node *>& que,vector<vector<int>>& m)
!是逻辑运算符(与||,&&是一类符号),表示逻辑取反,可以把非0值变成0,把0值变为1
~是位运算符(与|,&是一类符号),表示按位取反,在数值的二进制表示上,将0变为1,将1变为0
8 int 是进行拷贝构造,而const int & 是返回的引用- 拷贝构造更消耗时间,与此同时还用析构函数。因此for (const int& num : nums)比for (int num : nums)更快
9 ans+=n&1;与ans=ans+n&1;的结果不同_原因:加号的优先级大于位与的优先级,后面一个应该写成ans = ans + (n & 1)
10 在处理大量数据时数组速度远超vector速度,以下是建立数组的代码
bool * isp=new bool [n]; delete[] isp;
11 map可以使用map<map<char,int>,int>嵌套,而unordered_map不能使用嵌套
12 变量初始化
int start(0)
强制类型转换 char tmpChar = s[end];
vec[int(tmpChar)] = end;
13 set<int> st;auto it = st.upper_bound(4);找set中第一个比4大的数
14 Set.contains(e) 查找set中是否含有e,返回布尔值
15 (v%k + k) % k 正确取模方法,包含正数和负数
16 快速去重
set<int> st(vec.begin(), vec.end());
vec.assign(st.begin(), st.end());
17 for(;;)速度比while(1)快
18 特殊数据结构初始化
vector<string> t={"a","b"};
map<int,int> m={{1,2},{3,4}};
19 multiset是<set>库中一个非常有用的类型,它可以看成一个序列,插入一个数,删除一个数都能够在O(logn)的时间内完成,而且他能时刻保证序列中的数是有序的,而且序列中可以存在重复的数
20 查找字符串中某字符第一次出现的位置 int pos=s.find('e'); if(pos == string::npos)
set.lower_bound(4)//查找第一个大于等于4的元素,返回此元素迭代器,未找到返回set.end() set.upper_bound(4)//查找第一个大于4的元素,返回此元素迭代器,未找到返回set.end()
22 树集合
,Java 中的 Treeset
或者 C++ 中的 set
,是由高度平衡的二叉搜索树实现的。因此,搜索、插入和删除的时间复杂度都是 O(logN)
散列集合,Java 中的 HashSet 或者 C++ 中的 unordered_set ,是由哈希实现的,当存在具有相同哈希键的元素过多时,将花费 O(N) 时间复杂度来查找特定元素
哈希集和树集之间的本质区别在于树集中的键是有序
的。
23 输出数组的全排列
vector<vector<int>>res; sort(nums.begin(),nums.end()); do{res.push_back(nums);} while(next_permutation(nums.begin(),nums.end())); return res;
24 for(int i=10;i>=0;i--)等效于for(int i=10;~i;i--) 注意~i=-1-i
25 using ll = long long;
26 在 C++ 中 set/multiset
是有序的集合,它们是基于红黑树实现的。其中 set
会对元素去重,而 multiset
可以有重复元素。
27 set最小是set.begin(),最大是set.rbegin(),set.end()储存着set.size()