
数据结构与算法
vegetablesssss
一只菜鸟。
展开
-
矩阵相关算法
给定一个 n × n 的二维矩阵 matrix 表示一个图像,请你将图像顺时针旋转 90 度。原创 2024-10-12 10:08:06 · 381 阅读 · 0 评论 -
单双链表反转
【代码】单双链表反转。原创 2024-05-27 09:13:16 · 298 阅读 · 0 评论 -
排序算法总结
【代码】排序算法总结。原创 2024-05-14 16:36:03 · 138 阅读 · 0 评论 -
堆排序思路
原理 堆排序顾名思义,就是利用堆这种数据结构来进行排序,堆是一个完全二叉树,关于什么是完全二叉树可以参考完全二叉树和满二叉树,并且满足父节点总是大于子节点或者小于子节点,父节点大于子节点的叫大顶堆,小于子节点的叫小顶堆。 要实现由小到大排序,就得建立大顶堆,反之小顶堆。堆排序实现思路如下:2.1、初始化数组,创建大顶堆。 1. 大顶堆的创建从下往上比较,不能直接用无序数组从根节点比较,否则有的不符合大顶堆的定义。2.2、交换根节点和倒数第一个数据,现在倒数第一个数据就是最大的。2.3、重新建原创 2021-09-29 17:10:59 · 562 阅读 · 0 评论 -
完全二叉树和满二叉树
满二叉树顾名思义,二叉树的节点是满的,没有空的,也就是每个节点要么没有子节点,要么有左右两个子节点。 上图中左图就是完全二叉树,右图就不是,完全二叉树的性质:深度为k的完全二叉树拥有2^k-1个节点完全二叉树树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树,总结就是,满二叉树从右下角开始向左去除节点就是完全二叉树。 上图中左图是完全二叉树,右图就不是...原创 2021-09-29 12:07:23 · 1969 阅读 · 0 评论 -
哈希表和红黑树
哈希表 哈希表顾名思义是一张表,可以用它来存储键值对这种对应的数据,大家都知道,哈希表的查找速度很快,时间复杂度伪O(1),那么它的查找速度为什么很快呢? 实际上,哈希表将键值变为数组的下标,而将下标对应的值变为键值对的值,这样的话就可以通过下标的方式来获取对应的值,因此其查找速度非常快。 那么key值是如何变为哈希表的下标的呢?这里就要用到散列函数,通过散列函数将key值变为数组的下标。最常用的构造散列函数的方法是除留余数法。对于散列表长为m的散列函数公式为:f(key) = key mo原创 2021-09-29 10:37:36 · 3611 阅读 · 0 评论 -
动态规划经典问题
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。规定每次只能向下或者向右移动一步。输入:[[1,3,1],[1,5,1],[4,2,1]]输出: 7解释: 因为路径 1→3→1→1→1 的总和最小。动态规划:1、由于路径只能向右或者向下,因此第一行和第一列的路径是唯一的,只需要把对应的元素值相加即可。2、对于不是第一行和第一列的元素,可以从上方的元素向下移动或者左方的元素向右移动到达,到达该元素位置的最小路径等于其上方或者左方的原创 2021-09-07 17:56:03 · 688 阅读 · 2 评论 -
递归潜在的风险
二叉树的遍历可以通过递归实现,下面是二叉树的先序遍历。void preOrder(BiTree* root){ if (root != NULL) { visit(root); preOrder(root->lchild); preOrder(root->rchild); }} 递归算法存在一个问题:当递归层数过深时,有可能产生栈溢出,例如,如果二叉树只有几百个节点,那么通过递归实现没有问题,但是如果二叉树有几百万个节点,使用递归就可能会发生栈溢出。 在递归调用原创 2021-07-05 17:30:12 · 1114 阅读 · 1 评论 -
找出人群中唯一的单身狗
一个数组中除了一个数字只出现一次外,其余数字均出现偶数次,要求只扫描数组一次,找出这个只出现一次的数字。注意,只扫描一次,因此不能用排序。使用异或位运算符。1、两个相同的数字进行异或操作的结果为02、任何数字与0进行异或操作的结果都为这个数字本身int getSingleDog(int* a, int n){ int result = 0; for (int i = 0; i < n; i++) { result ^= a[i]; } return result;}异或中原创 2021-06-18 10:10:26 · 160 阅读 · 1 评论 -
计算二进制数中1的个数
这里要使用到&位运算符,想一下,1 & 0 = 0;1 & 1 = 1;可以将该二进制数与1进行&运算,运算结果如果为真(1),二进制数中1的个数就加一,然后将二进制数右移一位,如此循环下去。 int num = 1000; int count = 0; for (count = 0; num != 0; num = num >> 1) { if (num & 1) count++; }第二种解法,1、num-1的结果实际原创 2021-06-18 09:27:05 · 421 阅读 · 0 评论 -
查找算法-二分查找
使用条件1、只适用于有序排列的序列2、需要随机访问元素,只适用于顺序结构,不适用于链表代码实现//数组名,数组长度,需要查找的数,返回查找到的数组下标int bin_search(int key[], int n, int k){ int low = 0, high = n - 1, mid; while (low <= high) { mid = (low + high) / 2; if (key[mid] == k) { return mid; } if原创 2021-06-09 17:11:41 · 125 阅读 · 0 评论