算法
文章平均质量分 55
zt_xiaozhi
纵有疾风起,人生不言弃
展开
-
双指针技巧
双指针通常是二重循环的优化,当固定一个指针,另一个指针的已经走过的序列无需回退,这通常需要根据场景作一定的分析和证明。两指针相遇时通常可以得到答案的候选集。双指针算法需要考虑两个指针的行走顺序。双指针的完备性可以通过以下方式确定:具体问题要具体分析。例;给定两个升序排序的有序数组, 求分别从两个数组中挑选一个数其和是某个目标值。输入两个数组数量n和m,以及目标值。接下来两行分别是两个数组。最后求两个下标。数组一定不是空且一定存在解。最长连续不重复子序列给定一个长度为 n 的整数序列,请找出最长的原创 2022-06-25 19:45:11 · 214 阅读 · 1 评论 -
redis中基础数据结构
redis 是大家比较常用的一款内存数据库,其高并发能力和简洁的使用受产业界频繁采用。本篇根据资料概括redis 的数据结构和实现逻辑。部分内容需要进一步阐释将在其他地方展开。用户视角的数据结构主要有 字符串,列表,字典哈希,集合,有序集合,其它数据结构不在本文讨论范畴以内。在redis的以内这些统统称为redis对象。那么redis为了高效,自己对这些数据结构有着高效而独到的实现。我们知道redis是c语言写的,c的语言库匮乏,许多结构不具备,不符合成熟数据结构的要求,一方面有着诸多边界条件抛给编程者处理原创 2022-06-21 07:40:01 · 169 阅读 · 0 评论 -
高精度四则运算程序实现
高精度对于有些语言来说都有成型的库函数供程序员使用,但是其中对于算法的考量来说,我们还是希望重新感受一下实现的过程。以c++为例,对于一般的 int,long,或者 long long 类型的能够满足大多数场景,但对于成百上千位的大数来说这些就无能为力了。本文参考相关资料整理了加减乘除的大数算法小题目。 回顾一下最基本的运算规则用程序如何实现。给定两个正整数,不含前导0, 计算他们的和。整数长度范围 [1, 100000]实现思路也比较直接,我们无非是要按位相加,时刻记住进位补数即可,根本在于我们用一个数原创 2022-06-18 21:40:31 · 234 阅读 · 0 评论 -
实现红黑树(已leetcode验证)
代码已在leetcode验证了。是正确的,内存稍微多一些,时间上要好一些。大家可以看看下提交记录中的内存和时间差异。其他两种平衡二叉树参考 [[AVL 树]] [[跳表]]在红黑树的学习过程中,我接触到两种红黑树的描述,一种是左偏红黑树,另一种是算法导论中一般意义上的红黑树。前者是红黑树的简化版本。本偏只是原理和实现,没有说应用。红黑树的左偏和右偏版本左偏红黑树被设计为和一种叫2-3树的等价树,左偏红黑树是2-3树的另一种结构表现形式。这很好,因为2-3树是绝对平衡的二叉搜索树!2-3树原创 2022-03-16 21:31:06 · 933 阅读 · 1 评论 -
实现 AVL 树
平衡树和平衡因子AVL 树是最早的平衡二叉树。对于AVL树的任意一个节点,左子树和右子树的高度差不能超过1用某子树左右两子树高度差作为平衡因子的度量实际存储时,每个节点存储其所在子树的高度,用以辅助求解平衡因子。平衡树性质验证中序遍历的序列是从小到大排列的。每个节点的平衡因子绝对值不超过1平衡树性质的维护什么时候维护当插入和删除的节点时,有可能破坏树的平衡。当平衡被破坏时候,通过左旋和右旋自底向上的将树重新调整到平衡状态。如何维护LL ...原创 2022-02-19 23:11:17 · 167 阅读 · 0 评论 -
设计跳表(leetcode 1206)
跳表是平衡树的一种替代方案,优点是实现较为简单。它以多于原始数据一倍的存储空间换取查询效率。发明的动机应该是想对链表进行二分查找,逐渐演化出的算法。跳表在工程领域有广泛的应用。 比如 redis的zset,rocksdb中的内存部分实现等。也是一些语言基础包中的数据结构。跳表,下面这篇文章写的真的很不错跳表解释的好文章于是读完之后仿照思路实现了一遍,可以拿 leetcode 1206 来验证正确性.实现过程中体会到下面几点1. 跳表采用空间换时间的方式,比原始数据存储量增加一倍左右.原创 2022-02-13 15:13:14 · 378 阅读 · 0 评论 -
简明算法之树状数组
树状数组是什么树状数组也叫 二叉索引树,其初衷是要解决数据压缩中累计频率的计算问题。现在多用于高效计算 频繁修改的数列的前缀和与区间和。所谓高效是可达到log(n) 的时间复杂度。树状数组结构举例说明, 绿色是生成的树状数组的元素:树状数组是基于原始数组构建,构建方式分多次,每次在当前层构建,原始数组是构建的第0层。在第i层构建时,从左到右按照 间隔 2^i 元素结合成配对元素中右元素的上层节点,上层节点值是该两个节点的和。当如图所示的树状结构形成时,其树状数组每个元素...原创 2021-12-29 23:35:08 · 239 阅读 · 0 评论 -
简明算法之归并排序
算法思想;分而治之算法步骤;1. 确定分界点 x= ( l + r) /22. x 左边和右边分别归并排序3. 将x左右两边的值合并算法模版#include<iostream>using namespace std;const int N = 100010;int tmp[N];int a[N];void merge_sort(int l, int r) { if (l >= r) return; int mid = l + ...原创 2021-12-29 23:19:05 · 299 阅读 · 0 评论 -
简明算法之快速排序
算法思想:分而治之算法步骤1. 确定分界点 a[l] , a[(l + r)/2] 或 a[r] 值2. 调整区间,使得所有<=x 在左半边,>=x 在右半边3. 递归处理2中左右两端算法模版:void quick_sort(int * a, int l, int r) { // 左闭右闭 if (l >= r) return; int i = l - 1, j = r + 1, x = a[l + r >> 1]; wh...原创 2021-12-29 23:17:33 · 335 阅读 · 0 评论 -
最大连续子乘积
写文章只是为了整理思路吗,在远古的学生时代,可能只是为了机试参加个比赛什么的, 作为一届老人,早已没了会点啥就想拿出来炫耀的年纪, 会点除了能混过面试,是不是也能和面试官聊出点感情,程序似乎无可避免悄然而然成了我们生活中心 ,相顾两无言,唯把代码谈。朦胧周末早上起床,昨晚与老友聊此题记忆犹新。 今日把递推式子写一下,发现昨晚睡意之下并非完全想的清楚。拿到这个问题,长的都像动态规划,你可能很快就兴奋的想到一个二维动态规划的式子 ,```p (I , j) = p (i-1, j) * e...原创 2020-09-13 13:36:44 · 126 阅读 · 0 评论 -
找出那个出现一次的数
本人算法没什么天赋,但时常想拿个小题想想,倒没什么功利(例如找工作)目的,充实一下时间。曾经出现频次很高的一个问题,说一个整数序列中有除了一个数字出现一次,其余都出现了两次。现在让你扫一遍数组O(n)找出那个数。方法是将所有的数作异或操作,结果就是你要找的。leetcode 137 对这个问题升级了一下,现在问你,其余的数都出现三次呢,该如何找出那个出现一次的数。我感觉对我来说还是挺难的,解决方法...原创 2018-04-12 16:45:59 · 374 阅读 · 0 评论 -
丑数
第n个丑数的算法原创 2017-07-22 23:33:30 · 233 阅读 · 0 评论 -
二叉树反序列化与直观打印
二叉树算法当中一般不提供相应的输入输出函数,这就使得在调试相关二叉树算法的时候需要手工的在纸上演算而没有直观的观察到效果.自己做了一点费力的工作,将二叉树层次遍历的序列还原成二叉树,并且将二叉树尽量形象的打印出来.反序列化的过程我们这样定义,对于一个任意的二叉树,按照层次遍历的方式得到序列,空节点用#表示,分隔符采用!. 例如序列 1!2!3!#!4!的结构是: 1原创 2017-05-24 20:19:12 · 304 阅读 · 0 评论 -
Gas Station
问题描述: 有N个油气站构成环形路径,第i个油气站有gas[i]个单位的油,一辆容量无限的油罐车从第i个油气站到第i+1个油气站需要消耗cost[i]个单位油. 如果这辆车能够从任意一站出发依靠油气站补给能够回到原来的地方.求这个起点, 如果不存在输出-1. .分析:假设从站start出发,到第n个油气站,记 sum=∑ni=startgas[i]−cost[i]sum =\sum_{i=sta原创 2017-04-21 22:15:28 · 300 阅读 · 0 评论 -
B 树的删除操作
对于B树的删除操作研究了好些时日,感谢这篇文章让我对这个过程清晰起来. 对于B树的删除可能会破坏掉B树的充要条件,因此有必要回顾以下B树的定义(算法导论): 一棵B树是具有如下性质的有根树. 每个节点具有以下域: n[x]:当前存储中关键字的个数 n[x]个关键字本身:以非降序存放,因此key1[x]≥key2[x]≥...≥keyn[x]key_{1}[x] \g原创 2017-04-12 13:17:14 · 908 阅读 · 0 评论 -
排序算法总结
知道了很多的排序算法也许不一定有一个全局的把握,为了在应用场景做出更耗的选择,在此对各种排序算法做一些总结。 排序分为比较排序和非比较排序,比较排序一般是插入排序,选择排序,冒泡排序,快速排序,还有反应分而治之的快速排序和归并排序,比较排序的下界是O(nlog(n))。 而非比较排序时间复杂度可以低至O(n),比如基数排序,计数排序,桶排序,这些排序对数据有特殊的要求。 另一方面我们还要关心排序原创 2017-03-16 00:21:19 · 209 阅读 · 0 评论 -
网易雷火盘古实习2018笔试题
第一次笔试没有参加,但是牛客上已经有题了,很遗憾只做出前两道.感觉有很多要注意的地方,要不然根本做不完啊. 题目1:给定一个字符串,请你将字符串重新编码,将连续的字符替换成“连续出现的个数+字符”。比如字符串AAAABCCDAA会被编码成4A1B2C1D2A。.统计连续出现的字符数目.注意数字字符串之间转换,别要在这些细节上浪费太多时间,要不然后边题没时间做!代码:#include<iostrea原创 2017-03-10 20:04:27 · 6880 阅读 · 0 评论 -
Binary Tree Inorder Traversal
二叉树中序遍历的非递归实现 Given binary tree like [1,null,2,3], 1 \ 2 / 3 return [1,3,2].二叉树中序遍历这种简单的题目还用写题解,大神饶命,只是想写写遍历的非递归实现,并且实在感觉对我来说有点难度,很难想得出来,想理一理记住了.我等凡人就是如此啊.递归实现真是有些简单,代码如下: vo原创 2017-02-10 13:01:59 · 259 阅读 · 0 评论 -
Restore IP Addresses
这种带有回溯问题感觉有一种递归解决问题的范式,以此题为例写出自己的题解,自娱自乐,提神醒脑题目叙述xx 给定一个只包含数字的ip地址的字符串,返回所有可能合法的ip地址,例如,输入”25525511135”,程序应该返回: [“255.255.11.135”, “255.255.111.35”].分析假如当前的状态已经提取了前边的几个数字组成 No 组ip地址(总共四组),那么下一组可能有接下来连续原创 2017-02-10 10:36:56 · 404 阅读 · 0 评论