LeetCode刷题笔记(一)---剑指Offer前二十

    技术2025-05-02  11

    1、c++中有可以直接用的排序算法:sort函数,具体用法为sort(iterator start, iterator end );放入数组的起始位置和终止位置即可,比如sort(nums.begin,nums.end); sort()函数是标准模板库的的函数,已经进行了优化,根据情况的不同可以采用不同的算法,所以较快。另外,sort()是类属函数,可以用于比较任何容器,任何元素,任何条件。

    2、c++中获取二维数组行列数的方法:行:sizeof(a)/sizeof(a[0]),列:sizeof(a)/sizeof(a[0][0]) 或者行:a.size()列:a[0].size();

    3、c++反转数组:这个是使用C++STL库里的reverse函数,需要包含头文件 • vector reverseArray(vector a) { reverse(a.begin(),a.end()); return a; }

    4、在c++中,vector是一个十分有用的容器。 作用:它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据; vector在C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库; 实例:vectortest; //建立一个vector,int为数组元素的数据类型,test为动态数组名; 尾部插入数字:test.push_back(a); 两个数组连接 test.insert(test.end(),test2.begin(),test2.end());

    5、队列(queue)的基本操作:先进先出 入队,如例:q.push(x); 将x 接到队列的末端。 出队,如例:q.pop(); 弹出队列的第一个元素,注意,并不会返回被弹出元素的值。 访问队首元素,如例:q.front(),即最早被压入队列的元素。 访问队尾元素,如例:q.back(),即最后被压入队列的元素。 判断队列空,如例:q.empty(),当队列空时,返回true。 访问队列中的元素个数,如例:q.size()

    6、广度优先搜索(BFS)与深度优先搜索(DNS) BFS基本思想

    基本步骤:

    1.从图中某个顶点v0出发,首先访问v0;

    2.依次访问v0的各个未被访问的邻接点;

    3.依次从上述邻接点出发,访问它们的各个未被访问的邻接点。

    4.若此时图中仍有未被访问的结点,则另选图中的一个未被访问的顶点作为起始点。重复广度优先搜索过程,直到图中的所有节点均被访问过。

    DFS基本思想

    基本步骤:

    1.从图中某个顶点v0出发,首先访问v0;

    2.访问结点v0的第一个邻接点,以这个邻接点vt作为一个新节点,访问vt所有邻接点。直到以vt出发的所有节点都被访问到,回溯到v0的下一个未被访问过的邻接点,以这个邻结点为新节点,重复上述步骤。直到图中所有与v0相通的所有节点都被访问到。

    3.若此时图中仍有未被访问的结点,则另选图中的一个未被访问的顶点作为起始点。重复深度优先搜索过程,直到图中的所有节点均被访问过。

    7、pair是C++中一种模板类型。每个pair对象可以存储两个值,这两个值可以是不同的数据类型。存储的值可以是基本数据类型也可以是自定义数据类型。 声明命名空间:

    using namespace std; 或 using std::pair; pair<int, int> pdata; 或使用全名 std::pair<int, int> pdata;

    一、定义和初始化

    pair<int, int> p1(1, 2); pair<int, int> p2(p1); //用已有的对象初始化 pair<int, float> p3(1, 1.2); pair<int, int> p4; //没有显示初始化,自动执行默认初始化操作。p4为(0,0)

    二、赋值操作

    1、使用强制类型转换

    pair<int, int> p1(1, 2); pair<int, int> p2; p2 = pair<int, int> (1, 4);//赋值操作,需要用强制转换 p2 = p1; //赋值操作

    2、使用make_pair()函数

    pair<int, int> p3; p3 = make_pair(1, 4); //无需指明类型,可自动生成pair对象

    三、访问和修改操作

    pair有两个属性:first和second。

    pair<int, int> p1(1, 2); p1.first = 11; //修改第一个数值 p1.second = 22; //修改第二个数值 cout << p1.first << "," << p1.second << endl;

    8、数学运算 9、1<<i 是将1左移i位,即第i位为1,其余位为0; 例如1<<2 则0001->0100 n&(1<<i)是将左移i位的1与n进行按位与,即为保留n的第i位,其余位置零 如果n第i位为0,则n&(1<<i)的值为0 否则不为0 常用if(n&(1<<i)==0)用于判断n的第i位是否为0

    10、对于二进制位的运算符

    & : 与 操作.作用于两个二进制数,当然也可以对整型数据进行操作(当两边为整型数据会自动转化为二进制数).二进制与用来对位进行置零或者复位.如果两个值进行二进制与,只有当两个对应的位都为1时结果位上为1(同1结果为1,有0结果为0),其他情况都为0.如下:       01011001 & 00101001       结果为:00001001| :或 操作.和1的与操作类似.用来合并值.只有当两个对应位都为0,结果位为0(有1结果为1,同0 结果为0),其他情况都为1.例如:       01011001 | 00101001       结果为:01111001^ :异或 操作.这个运算符当两个值在某一位上相同时结果位为0,不同结果为1.如一个是1一个是0(相同为0 不同为1),结果位是1;两个都为1或者0结果位是0;例如:       01011001^00101001       结果为:01110000 4.~ :求补操作.这个运算符只对一个二进制数据进行操作,对该数每一位取反,(即1变为0,0变为1).例如:     ~01011001     结果为:10100110   最后两个为移位操作符.这两个操作符用来对一个值中的位左移或右移某个特定数字的位数.">>“右移操作.”<<"左移操作. "<<"左移操作:向左移动n位,相当于原数乘以2的n次方;存在问题:左移可能改变一个数的正负; ">>"右移操作:向右移动n位,值等于原值除以2的n次方; 例如:     01011001>>2  01011001<<2     结果为:0010110  01100100
    Processed: 0.016, SQL: 9