一、相关题目
1.数组与字符串
数组与字符串其本质是类似的,数组元素类型为char时就是字符串。
二者在内存中的存储地址是连续的,因此具有极快的查找速度O(1)。
但是数组必须提前设定好空间大小,数组元素的增加和删除则是非常慢的,需要移动相应元素的后面的所有元素才可,空间效率O(n)。
2.链表
链表在内存中存储不连续,因此必须遍历链表才能找出相应元素,查找速度慢O(n)
但链表中元素的增加和删除速度快,只需改变指针指向即可,空间效率O(1)
但是链表无需预分配内存,每增减一个节点便增减一定内存即可。
链表节点的删除和添加是基本功:
void DeleteNode(ListNode * head, int value)
{
ListNode * h1 = head;
ListNode * h2 = head->next;
while(h2)
{
if(h2->val == value)
{
h1->next = h2 ->next; //关键
return;
}
h1 = h2;
h2 = h2->next;
}
}
void AddNode(ListNode * head, int value)
{
ListNode * newnode = new ListNode(value);
ListNode * h1 = head;
ListNode * h2 = head->next;
while(h2)
{
if(h2->val > value)
{
newnode->next = h2;
h1->next = newnode;
return;
}
h1 = h2;
h2 = h2->next;
}
}
3.树
二叉树前序遍历:根-左-右
二叉树中序遍历:左-根-右
二叉树后序遍历:左-右-根
二叉树层序遍历:根-左-右-左左-左右-右左-右右
二叉搜索树:左子树所有节点的值 < 根节点值 < 右子树所有节点的值。
因此搜索树 中序遍历 会得到递增序列。
搜索树可以从根节点开始进行比较,大于根则相右小于根则向左,可以快速查找与插入。比如找10:
堆:根节点值 < 所有左子树节点值 且 根节点值 < 所有右子树节点值
平衡二叉树:任意节点 左右子树 深度相差不超过1
红黑树:节点除了数值还是红色黑色标记,根为黑色节点;叶子全为黑色空节点;红节点儿子全为黑节点;从根到任意叶子最长路径不会超过最短路径的2倍。是哈希表底层实现。
4.栈
栈可以用来筛选出保持某种单调性质的数据
- 柱状图中最大的矩形
思路:利用单调栈,意思是栈中元素具有某种单调性,例如本题中要保持nums[stack.top()]<nums[i],才能直接将nums[i]入栈。
关于单调栈的细节可以参考单调栈的介绍
题解可以参考https://blog.csdn.net/Zolewit/article/details/88863970 - 最大矩形
给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。 - 最长有效括号
给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
从尾到头打印链表
5.堆
堆的本质为优先队列,在贪心算法中有重要应用,例如dijkstra算法、最小生成树算法都有应用。
但是注意自定义比较函数cmp的方法。
struct cmp{
bool operator()(Node * a,Node * b)
{
return (a->val)<(b->val); //大顶堆,(a->val)>(b->val)为小顶堆。a看作堆底,b看作堆顶。
}
};
priority_queue<Node*,vector<Node*>,cmp> p;
priority_queue<int,vector<int>,greater<int>> p; //小顶堆