【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)
7
    !是逻辑运算符(与||,&&是一类符号),表示逻辑取反,可以把非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)
21  set可以用作滑动窗口
    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()

 
posted @ 2020-05-17 01:09  海底淤泥  阅读(347)  评论(0编辑  收藏  举报