随笔分类 - 算法和数据结构
1
摘要:堆是一种二叉树结构 1.堆是一个完全二叉树(从上到下,从左到右依次填满) 2.堆中的每一个节点都要大于等于他的孩子节点(最大堆)或者小于等于他的孩子节点(最小堆) 最大堆的堆顶元素是他的最大值,最小堆的堆顶元素是他的最小值 访问(堆里面不通过索引访问) 搜索O(1)一般只查看堆顶元素 添加O(log
阅读全文
摘要:没有孩子的节点是叶子节点 树的高度是从下往上算的,叶子结点的高度是0,根节点的高度最大 树的深度是从上往下算的,根节点的深度是0,叶子结点的深度最大 层是从上往下看的,根节点是第一层,越往下层数越多 满二叉树:除了叶子节点每个节点都有两个孩子 完全二叉树:从树的根节点从上到下,从左到右依次填满节点形
阅读全文
摘要:哈希表 = 散列表 key:value 键值对 python的哈希表就是字典,c++是std::map 哈希碰撞:两个不同的key通过同一个哈希函数得到了相同的内存地址 哈希表中不存在访问 搜索O(1)如果发生哈希碰撞他的时间复杂度就是O(K)k是碰撞的元素个数 插入O(1) 删除O(1) 常用操作
阅读全文
摘要:栈的访问时间复杂度O(1) 搜索时间复杂度O(N) 插入删除的时间复杂度是O(1) 常见操作: 1.创建栈 2.添加元素 3.查找栈顶元素-即将出栈的元素 4.删除栈顶元素-即将出栈的元素 5.栈的长度 6.栈是否为空 7.遍历栈(便删除栈顶元素,边遍历) 20 给定一个只包括 '(',')','{
阅读全文
摘要:队列的访问和搜索时间复杂度都是O(N) 插入和删除的时间复杂度都是O(1) 常见操作: 1.创建队列 2.添加元素 3.获取即将出队的元素 4.删除即将出队的元素 5.判断队列是否为空 6.队列长度 7.遍历队列 933 写一个 RecentCounter 类来计算特定时间范围内最近的请求。 请你实
阅读全文
摘要:数组的内存空间是连续的,链表是不连续的 链表分为单端链表和双端链表 访问O(N) 搜索O(N) 插入O(1) 删除O(1) 写很快但是读很慢 常用操作: 1.创建链表 2.添加元素 3.访问元素 4.查找元素 5.删除元素 6.链表的长度 203 给你一个链表的头节点 head 和一个整数 val
阅读全文
摘要:数组指在连续内存空间中存储一组相同类型的元素 数组通过索引实现访问 O(1) 数组通过遍历整个数组来实现搜索 O(N) 插入和删除的时间复杂度都是 O(N) 特点是适合读不适合写 1.创建数组 2.添加元素 3.访问元素 4.修改元素 5.删除元素 6.遍历数组 7.查找元素 8.数组的长度 9.数
阅读全文
摘要:二分法有点类似于数学中的零点定理 如果单调直线区间左右异号,那么零点一定在这个区间内 二分检测的思想就是吧原数组的起点和终点当作区间的界,然后找中点,如果中点元素大于要找的数字,且数组是升序数组,那么中点就变成了右界,反之,重点变成左界,循环操作,直到左右界重合 代码 #include<iostre
阅读全文
摘要:原理有点太绕了,找时间补上,先贴代码 #include<iostream> #include<string> using namespace std; int* Next; int KMP(char* Str, char* SubStr); void NextTable(char* Str); in
阅读全文
摘要:对撞指针 给定一个有序整型数组和一个整数target,在其中寻找两个元素,十其和为target,返回这两个数的索引 如:[2,7,11,15],target=9 输出 [1,2] 最直接的解法就是暴力解法,双层遍历,这样他的时间复杂度就是O(n^2) 但是暴力解法没有利用他的已知条件,就是有序 双指
阅读全文
摘要:给定一个整型数组和一个数字s,找到数组中的最短连续子数组,使得连续子数组的和sum>=s,返回这个最短连续子数组的长度值 如给定[2,3,1,2,4,3],s=7 答案为[4,3],返回2 第一种解法就是暴力解法,采用双循环来遍历所有的子数组,代码如下 #include<iostream> usin
阅读全文
摘要:二叉堆的本质是完全二叉树 大顶堆:每个节点的值都大于他的子节点 小顶堆:每个节点的值都小于他的子节点 二叉堆的根节点就是他的堆顶 堆的存储结构 虽然堆的数据结构是树,但是它并不是以链式结构存储的,而是顺序存储(数组) 通过数组下标可以定位父亲节点或者孩子节点,堆中的最后一个父亲节点就是(数组长度-1
阅读全文
摘要:快速排序类似于冒泡排序,冒泡排序是在一次排序中找出最大或者最小的数,然后将它冒出,快速排序是依次排序找出基准数的位置(或者说确定所有数的性质,大于基准数或者小于基准数),一般取数组第一个元素为基准数 过程是先确定一个基准数,然后经过一次排序,将所有大于基准的数放到基准数右边,所有小于基准数的都放大基
阅读全文
摘要:将整数转化为二进制数,要除2取余,余1这一位就是1,整除这一位就是0,存在两种特殊情况,就是输入的数是1或者0,因为<2所以没法做整除判断,所以要在程序开头做个判断,如果输入的是0,直接返回1的个数为0,因为整除法得到1的个数要比正常的少一个,所以最终要给1的个数+1,所以输入的数是1也可以算到这种
阅读全文
摘要:二叉树的建立,前序遍历,中序遍历,后序遍历以及求深度和叶子节点个数 #include<windows.h> #include<stdio.h> #include<malloc.h> typedef struct TreeNode{ int data; struct TreeNode *left,*r
阅读全文
摘要:通过c语言自定义数组长度 能够识别出多个重复的数据,将其输出并返回下标 时间复杂度O(n^2) 使用双重循环查找,找到直接break,注意break和continue的区别 #include<stdio.h> #include<stdlib.h> #include<windows.h> int ma
阅读全文
摘要:数组二分查找 #include<iostream> using namespace std; template <typename T> int binary_search_array(const T& key,const T data[],int N) { if(N<0) return -1; i
阅读全文
摘要:#include<iostream> #include<vector> #include<algorithm> #include<string> using namespace std; int main() { const int N=5; string a[N]={"www","algorith
阅读全文
摘要:对于一个(n,n)大小的矩阵,使得对角线上的元素全为x,其他元素都是y #include<iostream> #include<vector> using namespace std; int main() { const int n=20; int x=4; int y=2; int M[n][n
阅读全文
摘要:字符串操作 #include<iostream> #include<string> using namespace std; int main() { string name; cin>>name; cout<<"Hello ,"<<name<<endl; cout<<name.size()<<en
阅读全文
1