begin

LeetCode | 148. 排序链表

淺唱寂寞╮ 提交于 2019-12-02 11:04:07
原题 ( Medium ):   在 O ( n log n ) 时间复杂度和常数级空间复杂度下,对链表进行排序。    思路:自底向上(bottom-to-up)、归并排序(Merge Sort)    题目对时间复杂度和空间复杂度做出了要求,常用的对数级别的排序方法不多,由于这里并不是双向链表,所以快排不太可能,可以使用 归并 ,但一般的归并是需要一辅助数组的,空间复杂度为O(n),自然不能按一般归并的思路。我们可以考虑自底向上的归并,而非自上而下的递归归并,就是直接从两两合并开始,然后四四合并.......直到结束。   那么怎么把链表两两分开再两两合并呢?首先使用一整型变量size记录每轮需要两两分开和归并的节点数量,就是一个每次两倍倍增的数值(1、2、4....),我们可以使用 位运算 实现两倍倍增。然后怎么分开呢?要怎样把链表每两个节点分开成左右各一个,如stpe1一样?我们需要利用这个size把链表切开(step1的size为1),从链表头开始, 走过size个节点 (包括头节点)后,把链表 断开 ,断开后左边就是左半部分,右边的size个就是右半部分,例如4->3->...,断开后就变成了4,3->....,此时4就是左半部分,3就是右半部分,怎么把右半部分在链表中确认下来?继续把链表切开,从3( 右半部分的起点 )出发, 走过size个节点 (包括出发的节点)后

Mixly-RFID智能门禁

会有一股神秘感。 提交于 2019-12-02 09:19:32
Mixly-RFID智能门禁 测试卡号: void setup ( ) { Serial . begin ( 9600 ) ; SPI . begin ( ) ; rfid . init ( ) ; S erial . begin ( 9600 ) ; } void loop ( ) { if ( rfid . isCard ( ) ) { Serial . println ( RFID_readcardnum ( ) ) ; } } 下面给出截图 实验二: void setup ( ) { Serial . begin ( 9600 ) ; SPI . begin ( ) ; rfid . init ( ) ; RC = "" ; Serial . begin ( 9600 ) ; servo_6 . attach ( 6 ) ; } void loop ( ) { if ( rfid . isCard ( ) ) { RC = RFID_readcardnum ( ) ; Serial . println ( RC ) ; if ( RC == card [ ( int ) ( 0 ) ] ) { servo_6 . write ( 90 ) ; delay ( 3000 ) ; servo_6 . write ( 0 ) ; delay ( 0 ) ; } } 下面是截图

C++ ->List容器的应用

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-02 06:45:09
List 容器的应用 : 注释:list(双向链表):用动态链式存放数据,可以从任何位置快速插入和删除元素。在插入数据时需定位 迭代子的位置和值,即:inset(“迭代子位置”,“迭代子的值”)。 一个简单的创建list链表的 例子: #include<iostream> #include<list> #include<iterator> Using namespace std; Void main(){ List<int> L; List<int>::iterator p; int i,a[5]={1,2,3,4,5},b[3]={6,7,8}; p=L.begin(); for(i=0;i<5;i++){ L.insert(p,a[i]); } p=L.begin(); while(p!=L.end()) { cout<<*p<<" "; p++; } cout<<endl; p=L.begin(); //用push_back()函数在已有list序列尾扩容(插入数组) for(i=0;i<3;i++){ L.push_back(b[i]); } p=L.begin(); //用push_front()函数在已有list序列头扩容(插入数据) L.push_front(0); //p1=a1.begin(); L.push_front(9); p=L.begin(); L

【剑指OFFER】翻转单词顺序列

纵饮孤独 提交于 2019-12-02 06:37:45
题目描述 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么? class Solution { public: string ReverseSentence(string str) { int len=str.size(); if(len==0)return str; int l=0,r=0,i=0; for( i=0;i<len;i++){ if(str[i]==' '){ l=r; r=i; if(l>0)l++; reverse(str.begin()+l,str.begin()+r); } } if(r>0)r++; reverse(str.begin()+r,str.begin()+len); reverse(str.begin(),str.begin()+len); return str; } }; 来源: https://blog.csdn.net/a342500329a/article/details/102731937

关于如何快速释放STL容器vector元素的问题探究

落花浮王杯 提交于 2019-12-02 06:20:32
因项目需要在某些时间节点擦除vector所包含的内容,之前了解到STL的vector具有clear函数,拿来直接使用,结果代码会出现迭代器越界的错误,故对这部分进行了一番探究,当然是先翻各路大神的博客,大概得到几个结论,我将在结论下方附上验证过程: 1.clear函数做的事情是通过迭代器,从begin遍历到到end,过程中如果vector所储存的是对象,那么将会调用该对象的析构函数,此处需要注意的是如果存储的是指针那么将不会调用指针对应对象的析构函数,之后容器内的元素将被清空,但是容器实际占用内容不会被释放; //vector for class class ptrclass{ public: ptrclass(){ cout << "Access the ptrclass()" << endl; } ~ptrclass(){ cout << "Access the ~ptrclass()" << endl; } }; int main(int argc, char** argv){ vector<ptrclass> ptcla; ptrclass* pcl1 = new ptrclass(); ptrclass* pcl2 = new ptrclass(); ptrclass* pcl3 = new ptrclass(); ptcla.push_back(*pcl1);

51Nod1686 第K大区间 和 NOI2016 区间

放肆的年华 提交于 2019-12-02 05:57:55
谈一下尺取法的经典题。 第K大区间 定义一个区间的值为其众数出现的次数。 现给出n个数,求将所有区间的值排序后,第K大的值为多少。 众数:区间里出现次数最多的数字,例如:1 1 2 2 2,区间[1 1]的众数为1,区间[3 5]的众数为2 题解 二分这个值,转化成判断问题。 将求第k大变成求第n*(n-1)/2-k+1小,那么我们就可以用尺取法计算值小于等于二分值的区间的个数。 区间 在数轴上有 n 个闭区间 [l 1 ,r 1 ], [l 2 ,r 2 ], . . . , [l n ,r n ]。现在要从中选出 m 个区间,使得这 m 个区间共同包含至少一个位置。换句话说,就是使得存在一个 x,使得对于每一个被选中的区[l i ,r i ],都有 l i ≤ x ≤ r i 。 对于一个合法的选取方案,它的花费为被选中的最长区间长度减去被选中的最短区间长度。区间 [li,ri] 的长度定义为 ri − li,即等于它的右端点的值减去左端点的值。 求所有合法方案中最小的花费。如果不存在合法的方案,输出 −1。 n ≤ 500000,m ≤ 200000. 题解 将坐标离散化之后,用线段树维护点的覆盖次数。 那么用尺取法即可求出最小花费。 CO int N=500000+10,M=2097152+10; struct section {int l,r,len;}sec[N];

【C++】二分法搜索实现

无人久伴 提交于 2019-12-02 05:44:42
/*--> */ /*--> */ 二分法搜索实现 C++ 主要思路:   在[有序]序列中寻找某个给定值得位置,从中间位置开始搜索,如果中间位置正好是给定值,搜索完成;   如果不是,若中间位置的值大于给定值,则在前半段序列进行搜索;   若中间位置的值小于给定值,则在后半段序列进行搜索。   伪代码: 1 // 中间位置计算方法 若text长度为偶数,length/2 + begin 为中间两位的右侧; // 若text长度为奇数,length/2 + begin 为正中央位置。 2 3 // 注意: text.end 是尾元素的下一个位置 称为 [尾后迭代器] 4 5 mid = text.begin + text.length/2; 6 7 // 按照算法思路进行搜索 8 9 while(text.mid!=text.end&&!*text.mid!=value){ 10 11 if(value < text.mid) 12 13 end = mid; 14 15 else 16 17 begin = mid + 1; 18 19 // 重新确定中间位置 20 21 mid = text.begin + text.length/2; 22 23 } 24 25 C++ 示例: 1 #include <iostream> 2 #include <string> 3 using

模拟+细节题——cf1236D

空扰寡人 提交于 2019-12-02 05:39:45
思路好想,细节多的令人发指。。 /* 反着判断:走完每个点=走过的路程=n*m-k 然后暴力判每行每列的目的地 每次走都能使走的范围缩小一行或者一列 */ #include<bits/stdc++.h> #include<vector> using namespace std; #define N 200005 #define ll long long vector<int>R[N],C[N];//每一行|列内的障碍 ll tot,n,m,k; int main(){ cin>>n>>m>>k; for(int i=1;i<=k;i++){ int r,c;scanf("%d%d",&r,&c); R[r].push_back(c); C[c].push_back(r); } for(int i=1;i<=n;i++){ sort(R[i].begin(),R[i].end()); R[i].erase(unique(R[i].begin(),R[i].end()),R[i].end()); } for(int i=1;i<=m;i++){ sort(C[i].begin(),C[i].end()); C[i].erase(unique(C[i].begin(),C[i].end()),C[i].end()); } tot=1; int lx=-1,ly=-1,dir=1,up=0

静态链表过程演示及代码实现(A - B) U (B - A)

半腔热情 提交于 2019-12-02 05:18:43
静态链表说明 使用数组来实现链式存储结构,目的是方便在不设指针类型的高级程序设计语言中使用链式结构 c语言定义数据结构 #define MAX_SIZE 1000 // 所有的类型都统一定义为ElemType typedef int ElemType; typedef struct { ElemType data; int cur; } component, LinkList[MAX_SIZE]; 存储结构如下图所示 静态链表的工作原理 静态链表重点是在构建两个链表:备用链表(空闲的节点)和数据链表(已被使用的节点),下面来讨论一下两条链表是如何工作的 初始化链表,处标记颜色为空闲列表不可用时,其余所有的都属于备用链表(空闲的节点) 插入部分数据,静态链表同时产生备用链表(空闲的节点)和数据链表(已被使用的节点) 将上图结构分解一下,如下图 插入数据演示图 删除数据演示图 代码实现(A - B) U (B - A) 核心代码 void difference(LinkList &S1, int head) { ElemType temp, tail = head; // A = { 1, 2, 3, 4, 5}, B = { 4, 5, 6, 7, 8} int m = 5, n = 5; // Build the first collection for (int j = 1; j

C++ vector容器基本用法

若如初见. 提交于 2019-12-02 04:56:30
vector initialize: vector<int> v1; //empty vector<int> v2(v1) ; vector<int> v2(v1.begin(), v1.end()); vector<int> v3(n, i); //n numbers of i vector<int> v4(n); //n numbers of 0 int a[5]={0,1,2,3,3}; vector<int> v5(a,a+5); // v5 contains {0,1,2,3,3} 2D: vector<vector<int>> mat; v.size(); v.push_back(num); v.pop_back(); //v.erase(v.end()-1); v.begin(); //return begin memory address v.end(); //return end memory address + 1 sort(v.begin(), v.end()); iterator: for (vector<int>::iterator it = a.begin(); it != a.end(); it++){ cout << *it << endl; } 来源: CSDN 作者: eastlife1212 链接: https://blog.csdn.net