数据结构

一、相关题目

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;	//小顶堆
  • 合并K个排序链表
    给出一个vector<ListNode * > lists,按照从小到大顺序将lists中的链表整合到一个链表中。
  • 丑数II
    计算前n个丑数(因数只有2,3,5得数)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Starry丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值