算法
文章平均质量分 64
蓬莱道人
半路出家的研究僧
展开
-
对一个整数进行因式分解,求出所有质因数
给定一个正整数N,对N进行质因数分解,求解N的所有质因数。原创 2023-03-05 15:50:42 · 638 阅读 · 0 评论 -
跳跃表(SkipList)的原理和实现
1、什么是跳跃表2、跳跃表的实现1、什么是跳跃表 对于单链表来说,即便链表中存储的数据是有序的,如果我们要想在其中查找某个数据,也只能从头到尾遍历链表。这样查找效率就会很低,时间复杂度会很高,是O(n)。 如果我们想要提高其查找效率,可以考虑在链表上建索引的方式。每两个结点提取一个结点到上一级,我们把抽出来的那一级叫作索引。 这个时候,我们假设要查找节点8,我们可以先在索引层遍历,当遍历到索引层中值为 7 的结点时,发现下一个节点是9,那么要查找...原创 2021-02-17 11:28:57 · 1427 阅读 · 5 评论 -
LRU缓存的实现
1、题目描述2、代码实现1、题目描述 设计LRU缓存结构,该结构在构造时确定大小,假设大小为K,并有如下两个功能set(key, value):将记录(key, value)插入该结构 get(key):返回key对应的value值 要求:1、set和get方法的时间复杂度为O(1) 2、某个key的set或get操作一旦发生,认为这个key的记录成了最常使用的。 3、当缓存的大小超过K时,移除最不经常使用的记录,即set或get最久远的。2、代码实现 使...原创 2021-02-15 15:37:51 · 273 阅读 · 0 评论 -
外部排序
外部排序主要是针对磁盘文件很大,但是内存很小,不能一次把所有内容载入进行排序的场景。针对这种情况,主要有以下几种解决方案:1、使用bitMap2、二路归并3、多路归并——败者树1、使用bitMap 如果文件中所有待排序的元素都唯一并且不重复,那么可以选择使用这种方式进行排序。算法思想为:申请一个bitset,大小为元素所能取的最大值,对输入文件的元素进行遍历,将bitset的对应索引置1。然后遍历这个bitset,置1的bit位对应的索引输出到排序后的文件中。代码如下:...原创 2021-02-14 20:41:38 · 805 阅读 · 0 评论 -
柱状图中的最大矩形面积(leetcode 84)
1、题目描述 给定n个非负整数表示直方图的条形高度,其中每个条形的宽度为1,找到直方图中最大矩形的区域。 输入: [2,1,5,6,2,3] 输出: 102、解题思路(1)暴力破解 找出直方图中的所有矩形,然后求最大的面积,这种方法的时间复杂度为O(n^2),空间复杂度为O(1)。代码...原创 2019-09-11 17:55:45 · 1251 阅读 · 0 评论 -
二叉树中和为某一个值的路径(剑指offer-34)
1、题目描述 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。2、解题思路 可以使用一个栈来保存二叉树的路径,使用先序遍历的方式遍历二叉树。当遍历到一个节点时,将这个节点压入栈中。接着判断这个节点是否是叶子节点,如果是,计算栈中所有节点的值是否为目标整数,接着返回父节点,将叶...原创 2019-04-18 19:58:49 · 248 阅读 · 0 评论 -
二叉搜索树和双向链表(剑指offer-36)
1、题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。2、解题思路 一棵二叉搜索树,按照中序遍历为一个有序序列。我们可以按照中序遍历的思想,当我们遍历根节点时,先将左子树转换成一个有序链表,然后再将右子树转换成一个有序链表,接着用根节点将左子树和右子树串联起来。这是一个递归的过程,递归函数需要求出左子...原创 2019-04-18 19:48:26 · 198 阅读 · 0 评论 -
对单链表的排序(LeetCode-148)
1、题目描述 给定一个单链表,对这个单链表进行排序,要求时间复杂度O(nlogn),空间复杂度O(1)。2、解题思路 由于排序的要求是时间复杂度为O(NlogN),因此只能选择快速排序、归并排序、堆排序。如果待排序的序列是数组保存,那么快排空间复杂度最坏为O(N),平均为O(logN),归并排序空间复杂度为O(N),堆排序的空间复杂度为O(1)。如果待排序的序列是链表保存,...原创 2019-04-27 11:47:05 · 6134 阅读 · 1 评论 -
二叉树两个节点的最小公共祖先节点(LeetCode-236)
1、题目描述 给定一棵二叉树和二叉树中的两个节点,找出这两个节点的公共祖先节点。例如: 给定两个节点p = 5, q = 4,那么p和q的最小的公共祖先节点为5。2、解题思路 可以分别使用两个数组来保存从根节点到给定的两个节点的路径值,然后再从路径中找出最后一个相...原创 2019-04-27 11:04:07 · 2238 阅读 · 0 评论 -
整数序列中最长的连续序列个数(LeetCode-128)
1、题目描述 求一个整数序列中最长的连续子序列个数,比如输入:[100, 4, 200, 1, 3, 2],输出:42、解题思路(1)先排序,从有序序列中找连续子序列,时间复杂度为O(nlogn),代码如下: int longestConsecutive(vector<int>& nums) { if(nums.size()==0)...原创 2019-04-13 22:51:42 · 1346 阅读 · 0 评论 -
求无重复元素集合的所有子集(LeetCode-78)
1、题目描述 给定一个没有重复字符的字符串序列,求这个序列的所有子集。比如输入:123,输出为:1、2、3、12、13、23、123、NULL,总共有2^3 = 8个子集。2、解题思路 如果这个字符串长度为n,则使用一个n位的二进制来映射子集。首先初始化这个二进制数为0。接着遍历二进制的所有bit 位,对应为0,则这个子集不包含对应的元素,如果对应为1,则包含对应的元素,然...原创 2019-04-13 21:34:27 · 1984 阅读 · 0 评论 -
二叉树的最大路径和(LeetCode-124)
1、题目描述 输入一棵二叉树,求这课二叉树所有路径中最大的路径和。比如输入二叉树为:[-10,9,20,null,null,15,7],输出:42。 2、解题思路 我们知道,给定一个数组,求这个数组的连续子数组的最大和是比较容易的。而这道题目是将二叉树与连续子数组的最大和糅合在一起。因此我们需要在递归中求出二叉树路径的连续子数组的最大和。因此,在二叉树的递...原创 2019-04-20 20:44:39 · 1219 阅读 · 0 评论 -
数组中和为s的所有数字序列(LeetCode-39)
1、题目描述 输出一个数组和一个目标值,数组中不包含重复元素,找出数组中所有的元素序列,这些元素的和为目标值,元素序列可重复。比如说输入数组:[2,3,5],输入目标值:8,那么输出为:[ [2,2,2,2], [2,3,3], [3,5] ]2、解题思路 这个题目有点复杂,即使用暴力解也不一定马上想到思路。由于序列中的元素可以重复使用,给这道题目增加了难度。一种可行...原创 2019-04-20 13:46:25 · 2381 阅读 · 0 评论 -
二叉树两叶节点的最大距离(LeetCode-543)
1、题目描述 给定一棵二叉树,计算这课二叉树的直径长度,即为二叉树任意两个节点间的最长路径。比如: 这课二叉树的最长路径为3。2、解题思路 使用递归进行求解,每次递归的过程中,先求出以某个节点为树根的二叉树的左子树的最长深度left_len、右子树的最长深度right_len,并在递归函数中用一个变量diameter来保存任意两个节点间的最长路径。在求出左...原创 2019-05-05 15:26:38 · 5085 阅读 · 0 评论 -
掷多个骰子取最大值为结果,求结果的期望值
1、题目表述 总共有n个骰子,第n个骰子的的范围为1 ~ Xn,Xn表示第n个骰子的最大值,掷骰子时取所有骰子中的最大值作为本次的结果,求掷一次骰子的得到的结果的期望值。 示例: 输入: 2 2 2 输出:1.75 解释:输入的第一个2表示两个骰子,后面两个2表示两个骰子的范围都为1 ~ 2。2、解题思路 使用动态规划来解:使用...原创 2019-09-02 17:13:08 · 5795 阅读 · 0 评论 -
矩阵中的路径(剑指offer-12)
1、题目介绍 设计一个函数,用来判断在一个矩阵中是否存在一条包含某个字符串所有字符的路径,路径可以从矩阵中任意一格开始,每一步可以在矩阵中向左、右、上、下各移动一格,如果一条路径经过了矩阵中的某一格,那么该路径不能再次进入该格子。例下 3 x 4的矩阵中包含一条字符串"bfce"的路径,但是矩阵中不包含"abfb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不...原创 2019-09-12 17:23:46 · 335 阅读 · 0 评论 -
矩阵的最小路径和(leetcode 64)
1、题目描述 给定一个 m x n 的矩阵,矩阵中的每个元素都为非负整数,找出一条从左上角到右下角的路径,使得这条路径上的元素和最小。矩阵中的路径只能往下或者往右移动。示例: 对于这个矩阵,最小的路径和为 7 .2、解题思路(1)暴力法:类似于二叉树的递归 int minPathSum(vector<vector&l...原创 2019-09-19 12:07:46 · 1787 阅读 · 0 评论 -
矩阵中左上角到右下角的所有路径(leetcode 62)
1、题目描述 给定一个 m x n 的矩阵,从这个矩阵的左上角到右下角总共有多少唯一的路径?2、解题思路(1)暴力法(回溯法) 使用递归的方法来做,代码如下:void FindUniquePaths(int m, int n, int i, int j, int &sum){ if (i == m || j == n) { ...原创 2019-09-25 20:44:08 · 4516 阅读 · 0 评论 -
求两个集合的交集
1、题目描述 给定两个集合set1和set2,求这两个集合的交集。2、解题思路(1)暴力破解 这个方法最简单,直接暴力枚举,假设第一个几个set1的元素个数为 m ,第二个集合set2的元素个数为 n,那么这种方法的时间复杂度为O( m * n )(2)排序 对两个集合分别进行排序,时间复杂度为O( m log m)和O( nlog n),接着...原创 2019-09-27 21:38:46 · 4464 阅读 · 0 评论 -
判断一个数是不是素数
1、题目描述 一个数如果是素数,那么这个数只有两个约数,一个是1,另一个是其本身,如果一个数除了其本身和1之外还有其它约数,那么这个数就不是素数。2、解题思路(1)暴力破解 我们只需要从2开始,一直到小于其自身,依次判断能否被n整除即可,能够整除则不是质数,否则是质数。bool isPrime(int n){ if (n <= 3) { ...转载 2019-04-12 15:24:47 · 3711 阅读 · 0 评论 -
红黑树的插入和删除
本文转载于:https://blog.csdn.net/v_JULY_v/article/details/61056301、红黑树介绍(1)二叉查找树 二叉查找树,也称有序二叉树(orderedbinarytree),或已排序二叉树(sortedbinarytree),是指一棵空树或者具有下列性质的二叉树:若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点...转载 2019-04-09 10:43:31 · 720 阅读 · 0 评论 -
字符串的最长回文子串
1、题目描述 给出一个字符串,找出一个字符串的最长回文子串,比如输入:babad,输出:bab或aba,输入:dbbd,输出::bb2、解题思路(1)暴力求解 找出该字符串的每个子串,时间复杂度为O(n^2),判断这个字符串是否为回文子串的时间复杂度为O(n),总的时间复杂度为O(n^3),C++代码如下:#include<iostream>#inc...原创 2019-04-12 11:51:06 · 492 阅读 · 0 评论 -
把数组排成最小的数(剑指offer-45)
1、题目表述 输入一个正整数数组,把数组里所有的数拼接为一个数,打印出能拼接出的所有数字中最小的一个。比如输入:{3,32,321},输出:321323.2、解题思路: 这道题其实是希望我们能找到一个排序规则,数组根据这个排序规则排列后能排成一个最小的数。要确定排序规则,就要比较两个数字,也就是给出两个数字m、n,我们需要确定一个规则判断m和n哪个应该排在前面,而不是仅仅比...原创 2019-04-03 22:43:53 · 196 阅读 · 0 评论 -
求字符串的全排列(剑指offer-38)
1、题目描述 输入一个字符串,输出这个字符串的所有排列组合。比如输入:abc,输出:abc acb bac bca cba cab。2、解题思路 我们可以把一个字符串看成由两部分组成,第一部分是它的第一个字符串,第二部分是后面的字符串。我们求整个字符串的排列可以看成两步。第一步求所有可能出现在第一个位置的字符,即把第一个字符和后面所有的字符交换。第二部固定第一个字符,求后面...原创 2019-04-03 21:58:26 · 405 阅读 · 0 评论 -
找出包含序列的所有元素的最小长度子序列
1、题目描述 给定一个序列如S = {1,8,2,1,4,1,2,9,1,8,4},我们需要找到包含S的所有元素的最小长度子序列(不重复,顺序不重要)。如何有效地找到这个子序列?注意:S:{1,2,4,8,9 }中有5个不同的元素,最小长度子序列必须包含所有这5个元素。2、解题思想(1)暴力求解(时间O(n^2),空间0) 找出序列中的所有子串,判断每个子串是否包含...原创 2019-03-22 21:56:33 · 2459 阅读 · 0 评论 -
最大连续子序列和(剑指offer-42)
1、算法描述 给定一个序列,找出这个序列中最大的子序列的和,比如输入为1, -5, 8, 3, -4, 15, -8,最大值为8 + 3 + -4 + 15 = 22.2、解题思想(1)暴力解: 即遍历所有的子串的和,找出最大的那个,时间复杂度为O(n^2),暴力解面试一般通不过。(2)分析数组规律求解: 从前往后遍历,遍历到第一个数时,最大子序列和为...原创 2019-03-22 21:30:07 · 474 阅读 · 0 评论 -
和为s的两个数(剑指offer-57)
1、题目描述 找出一个递增数组中两个和为s的数字,比如给定数组:{ 1,2,4,7,11,15 } 和数字s=15,则找出的数字为11和4。2、解题思路(1)暴力解法: 时间复杂度为O(n^2),面试通不过滴。(2)双指针法: 使用两个指针,一个从头开始遍历,一个从尾开始遍历,如果两个指针所指向的值的和等于s,则找到这两个数。如果指向值的和大于s,则头...原创 2019-03-24 22:41:02 · 187 阅读 · 0 评论 -
梯度下降法求解多元线性回归的参数
1、题目描述 利用最小二乘法和梯度下降法求解多元线性回归的参数,其中X、Y是待拟合的数据,X是自变量,Y是因变量。 2、解题思路 使用梯度下降法来求解。损失函数为:1/2(y - f(x))^2,每进行一次迭代,先求出所有样本点的平均损失,然后损失函数对各个权重求偏导得到关于每个权重的梯度值,接着使用学习率和梯度值更新每个权重。这里的权重初始化不能为...原创 2019-03-16 22:59:26 · 2991 阅读 · 0 评论 -
求100亿个数的中位数
1、题目描述 给定100亿个无符号的乱序的整数序列,如何求出这100亿个数的中位数(中位数指的是排序后最中间那个数)。2、解题思路一 一个无符号整数的大小为4B,则100亿个数的大小为40GB,如果内存够大的话可以对这100亿个数加载到内存中,然后使用堆排序或者快速排序进行排序,取出中位数即可。使用快排时,每次划分之后只需要比较枢纽值的索引和50亿比较,然后只对两个划分中的...原创 2019-03-15 23:10:14 · 4631 阅读 · 2 评论 -
圆桌报数问题(剑指offer-62)
1、题目描述 一圈共有N个人,开始报数,报到M的人自杀,然后重新开始报数,问最后自杀的人是谁? 如图:内环表示人排列的环,外环表示自杀顺序;上面N=41,M=3。2、解题思路一:时间复杂度O(MN): 使用一个大小为N的bool数组来保存每个人是否被杀,然后一直循环遍历这个数组,直到所有人都被杀死。在...原创 2019-03-15 22:10:39 · 1162 阅读 · 0 评论 -
排列组合问题C(m,n)
1、直接求解 对于求解排列组合问题C<m,n>,第一种求解方式是直接求解,也就是采用数学上的公式,即 C<m,n> = A<m, n> / A<n, n> 对于这种求解方式而言,所使用的额外空间比较少,但是这种求解方式的时间复杂度是非常大的,因此我们...原创 2019-02-20 17:38:38 · 3715 阅读 · 0 评论 -
数组中出现次数超过一半的数字(剑指offer-39)
1、题目描述 找出整数序列出现次数超过一半的数,比如1,2,3,2,2,2,5,4,2序列中,出现次数超过一半的数字为2。对于这个题目,首先最简单的暴力解法是先对数组排序,然后取中位数即可,时间复杂度为O(n*logn)。第二种方式是使用额外的一个map来保存每个元素出现的次数,时间复杂度为O(n),空间复杂度为O(n)。当然这两种方式是不能通过面试滴。2、解题思路(一) ...原创 2019-03-23 13:43:50 · 383 阅读 · 0 评论 -
最长不含重复字符的子字符串(剑指offer-48)
1、题目描述 找出一个字符序列中一个最长的包含不重复字符的子字符串,比如在字符串“arabcacfr”中,最长的不含重复字符的子字符串是“acfr”,长度为4。2、解题思路(1)暴力破解 使用暴力法可以在O(n^2)的时间复杂度内找到字符序列的所有字符串,然后在O(n)的时间复杂度内比较这个字符串是否包含重复字符,因为暴力解的时间复杂度为O(n^3),如果面试用暴力解,...原创 2019-03-23 21:52:33 · 1474 阅读 · 0 评论 -
位图(Bitmap)的C++实现
本文转载于:https://blog.csdn.net/MBuger/article/details/616285721、位图(Bitmap)简介 位图是一种非常常见的结构,它使用每个二进制位来存放一个值的状态,正因为这个性质,它经常被用在数据压缩或者是索引等方面。 有这样一道题:给40亿个不重复的无符号整数,没有经过排序,然后再给一个树,如何快速判断这个数是否在40亿个数...转载 2019-04-08 20:32:45 · 2665 阅读 · 0 评论 -
海量数据处理的算法题目
题目1:给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url? 解题思路:可以估计每个文件安的大小为50G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。遍历文件a,对每个url求取has(url)%1000,然后根据所取得的值将url分别存储到1000个小文件(记为a...原创 2019-04-08 20:22:07 · 355 阅读 · 0 评论 -
字典树及其C++实现
1、什么是Trie树(参考) Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。字典树3个基本性质:...原创 2019-04-08 16:56:56 · 5611 阅读 · 0 评论 -
翻转字符串(剑指offer-58)
1、题目描述 输入一个字符串,翻转单词的次序。比如输入:"i am a student",输出:"student a am i"2、解题思路 首先整个字符串进行逆序。逆序之后,接着对每个单词进行逆序,时间复杂度为O(n)。代码如下:#include<iostream>using namespace std;void Reverse(char* beg...原创 2019-04-01 23:10:55 · 218 阅读 · 0 评论 -
最少的硬币组合出1到m之间的任意值(贪婪算法)
1、题目描述 本题是2019腾讯实习生笔试编程题第一题,也是NOIP2016 模拟赛的原题。题目是这样的:有 n 种不同面值的硬币,每种硬币有无限多个。为了方便购物,希望带尽量少的硬币,但是要能组合出 1 到 m 之间的任意值。2、解题思路 首先判断有无解,如果最小面额硬币大于1则无解,因为搭配不出1。如果有1则有解,因为所有面额都可以由1堆积出来。 接下来思考一个问题...原创 2019-04-06 16:32:59 · 1305 阅读 · 0 评论 -
硬币找零问题(动态规划)
1、题目表述 给定需要找零的面值money和可以使用的硬币种类(这里假设每种硬币的数量有无限多种),求出用这些硬币找零所需要的最小硬币数。比如money = 7,硬币种类为[1,2,5],那么需要找零1个面值2的硬币和1个5的硬币,总的硬币数为2个。2、解题思路 使用动态规划求解:我们用d(i)=j来表示凑够i元最少需要j个硬币。于是我们已经得到了d(0) = 0, 表示凑够...原创 2019-04-06 14:01:32 · 6674 阅读 · 0 评论 -
链表中环的入口节点(剑指offer-23)
1、题目描述 给定一个带环的链表,找出链表中环的入口节点。2、解题思路(1)求出环中节点的总数 使用两个指针,一个快指针fast和一个慢指针slow,向前移动时,快指针每次移动两个节点,慢指针每次移动一个节点,当快指针和慢指针相等时,它们两此一次在环中相遇。接着,按照以上策略继续向前移动,同时用两个计数器分别统计快指针fast和慢指针slow的前进步数,当两个指针再次相...原创 2019-04-04 22:16:21 · 143 阅读 · 0 评论