经典算法题
文章平均质量分 66
苍痕
这个作者很懒,什么都没留下…
展开
-
Leetcode 刷题题解
题解地址:https://leetcode.wang转载 2020-10-10 20:42:42 · 291 阅读 · 0 评论 -
2020-09-02
二分查找那些坑1. 二分搜索:寻找一个数如下两种实现方式,right 边界的取值,直接影响着算法的实现细节,这些细节稍不小心就会犯错。二分查找看似简单,实则不然,真正能考虑到所有细节,把代码写准确是很不容易的。int binarySearch(int[] nums, int target) { int left = 0; int right = nums.length - 1; // 注意,搜索区间是[left, right],左闭右闭 while(left <原创 2020-09-02 17:27:17 · 251 阅读 · 0 评论 -
递归调用:汉诺塔
题目:编程解决汉诺塔问题,使用数据结构栈(偷个懒,如果不知道汉诺塔是什么,请自行Google)解答一:递归调用汉诺塔是个非常经典的问题,讲递归时应该都会讲到它。如果我们没有递归的先验知识, 直接去解答这道题,常常会觉得不知道如何下手。用递归却可以非常优美地解决这个问题。使用递归的一个关键就是,我们先定义一个函数,不用急着去实现它, 但要明确它的功能。对于汉诺塔问题,我们定义如下函数原型原创 2016-12-29 10:25:11 · 1946 阅读 · 0 评论 -
动态规划:最少硬币找零问题、01背包问题、完全背包问题
动态规划把问题分为子为题,解决了这些子问题,再把子问题合并起来,便可以得到问题的解。在解决子问题过程中,需要把子问题的解保存起来方便后面使用。最少硬币找零问题为:给予不同面值的硬币若干种种(每种硬币个数无限多),用若干种硬币组合为某种面额的钱,使硬币的的个数最少。在现实生活中,我们往往使用的是贪心算法,比如找零时需要13元,我们先找10元,再找2元,再找1元。如果我们的零钱可用的有原创 2016-11-09 15:45:15 · 15563 阅读 · 2 评论 -
求最大连续子序列的和,两种解法:动态规划 & Kadane算法
这是一个经典问题,对于一个包含负值的数字串array[1...n],要找到他的一个子串array[i...j](0这里我们需要注意子串和子序列之间的区别。子串是指数组中连续的若干个元素,而子序列只要求各元素的顺序与其在数组中一致,而没有连续的要求。对于一个元素数为n的数组,其含有2^n个子序列和n(n+1)/2个子串。如果使用穷举法,则至少需要O(n^2)的时间才能得到答案。该问题是197原创 2016-11-05 15:18:46 · 3400 阅读 · 0 评论 -
经典算法: 输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数
题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次。假如需要求的N=23106,那么计算过程如下:万位=1:1 0000--1 9999 共计10000个千位=1: 0 1 000--2 1 999 共计3*1000 = 3000,其中3表示万位可以填原创 2017-01-07 18:35:59 · 5163 阅读 · 1 评论 -
动态规划:求最长公共子序列问题
最长公共子序列问题:子序列是指在原序列中删去若干元素(这些元素可以不相邻)后得到的序列。例如X=abcbdab,Y=bdcaba,bca和bcba都是X和Y的公共子序列,且后者是最长的公共子序列。给定两个序列X(m)={x[1],x[2],...x[m]}和Y(n)={y[1],y[2],y[n]},如何找出它们的一个最长公共子序列Z(k)={z[1],...,z[k]}。动态规划算法求原创 2017-01-07 17:59:19 · 2176 阅读 · 0 评论 -
动态规划:如何求解最大连通节点值
题目有N个小球,上面有数字,分别对应1……N,每个小球有个价值,第i个小球价值对应Value[i];有N-1个木棍,一个木棍两端分别连接着一个小球,把N个小球连接起来,并且保证任意两个小球间都不存在两条不同的路径可以互相到达。现在要把1号小球连通的M个刷上油漆(连通指的是这一些涂漆的小球可以互相到达并且不会经过没有涂漆的小球),要求使这M个小球的值得和最大。输入每个原创 2016-12-29 21:26:25 · 1133 阅读 · 0 评论 -
动态规划:求解最长递增子序列(LIS)
题目1:一个序列有N个数A[1],A[2],…,A[N],求出最长非降子序列的长度。 (DP经典问题LIS:longest increasing subsequence)注意:此处的子序列不一定是连续的,这跟最大连续子序列求和不一样!分析:我们定义d(i),表示前i个数中以A[i]结尾的最长非降子序列的长度,则动态规划转移方程为:d(i) = max{1, d(j)+1},其中原创 2016-12-25 23:28:44 · 1865 阅读 · 0 评论 -
二叉树的遍历
本文浅谈二叉树的遍历问题,采用C语言描述一、二叉树基础1)定义:有且仅有一个根结点,除根节点外,每个结点只有一个父结点,最多含有两个子节点,子节点有左右之分。2)存储结构: 二叉树的存储结构可以采用顺序存储,也可以采用链式存储,其中链式存储更加灵活。在链式存储结构中,与线性链表类似,二叉树的每个结点采用结构体表示,结构体包含三个域:数据域、左指针、右指针。二叉树在C语言中的定义如下:转载 2015-06-15 23:01:01 · 1185 阅读 · 0 评论 -
约瑟夫环问题:圆桌报数问题
约瑟夫环问题:一圈共有N个人,开始报数,报到M的人自杀,然后重新开始报数,问最后自杀的人是谁?如图:内环表示人排列的环,外环表示自杀顺序;上面N=41,M=3。最普通办法就是模拟整个过程:建一个bool数组,true表示此人还活着,false表示已经自杀。可以模拟整个过程[cpp] view plain copy原创 2016-12-24 23:43:08 · 5645 阅读 · 0 评论 -
经典算法:字符串的匹配压缩
http://blog.csdn.net/KangRoger/article/category/2056123原创 2016-11-09 22:01:23 · 2678 阅读 · 0 评论 -
经典算法:寻找最近公共祖先
题目假设现在他知道了N个人的信息——他们的父亲是谁。给出两个人的名字,找出这两个人是否存在同一个祖先,如果存在,那么他们的所有共同祖先中辈分最低的一个是谁?输入输出每个测试点(输入文件)有且仅有一组测试数据。每组测试数据的第1行为一个整数N,意义如前文所述。每组测试数据的第2~N+1行,每行分别描述一对父子关系,其中第i+1行为两个由大小写字母组成的字符串F原创 2016-12-28 20:14:08 · 7396 阅读 · 0 评论 -
经典算法题:谷歌面试经典题目
谷歌面试官经典作品(CTCI)目录1.1 判断一个字符串中的字符是否唯一1.2 字符串翻转1.3 去除字符串中重复字符1.8 利用已知函数判断字符串是否为另一字符串的子串2.1 从链表中移除重复结点2.2 实现一个算法从一个单链表中返回倒数第n个元素2.3 给定链表中间某结点指针,删除链表中该结点2.4 求由两个链表结点组成的数之和2.5 给定一个循环链表,原创 2016-10-31 00:14:42 · 9724 阅读 · 1 评论 -
将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5
对于质因数,我们可以很明显发现,对于一个数,他的质因数必然小于或等于该数的开方(又是开方啊!这么说我们又要用数学函数的sqrt()了。它的头文件是什么?)。那么,我们只要构造一个循环,从2开始到sqrt(n)结束。判断该数字是否能被正整数整除,将数字分解成因数,就可以啦~对于质因数,它还有一个特点,那就是它是质数!那么难道我们还需要一个判断因数是否为质数的函数吗?不,不需要。每个合数都可以转载 2014-09-17 18:05:28 · 8516 阅读 · 3 评论 -
史上最浅显易懂的KMP算法讲解:字符串匹配算法
KMP算法是一种改进后的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法)。KMP算法又称“看毛片”算法,是一个效率非常高的字符串匹配算法。相信很多人初识KMP算法的时候始终是丈二和尚摸不着头脑,要么完全不知所云,下面将结合本人的理解,用最浅显易懂的方法解释一下KMP算法。首先为什么要使用KMP原创 2016-02-18 20:32:05 · 23591 阅读 · 5 评论 -
经典算法题:数字三角形寻找最大路径——动态规划和递归调用两种解法
题目:数字三角形,从顶部出发,在每一结点可以选择向左走或得向右走,一直走到底层,要求找出一条路径,该路径上的数字和最大,输出这个最大值。(1)样例输入:第一行是数塔层数N(1第二行起,从一个数字按数塔图形依次递增,共有N层。51311 812 7 26 6 14 15 812 7 13 24 11(2)样例输出:86方法1动态规划状态原创 2016-11-10 15:11:32 · 7352 阅读 · 0 评论 -
经典算法题:排列组合-有放回地取不同颜色的小球
有6种不同颜色的球,分别记为1,2,3,4,5,6,每种球有无数个。现在取5个球,求在以下的条件下: 1、5种不同颜色, 2、4种不同颜色的球, 3、3种不同颜色的球, 4、2种不同颜色的球, 它们的概率。解答:排列用C,组合用A。既然题目说是无数个,就相当于有放回的取6个不同颜色的球。因此,如果任意取5个球,每取一个球都有6种可能,所有可能情况是6^5=7776,充当分母.原创 2016-10-30 23:27:02 · 26759 阅读 · 1 评论 -
动态规划:最长回文字符串
题目:请从一个已知的字符串中寻找最长回文字符串解法1:动态规划回文字符串的子串也是回文,比如P[i,j](表示以i开始以j结束的子串)是回文字符串,那么P[i+1,j-1]也是回文字符串。这样最长回文子串就能分解成一系列子问题了。这样需要额外的空间O(N^2),算法复杂度也是O(N^2)。 状态方程和转移方程: P[i, j] =原创 2016-12-24 19:47:30 · 12859 阅读 · 6 评论 -
二进制智力题
1、现有1000个苹果,10个盒子,现在要你将1000个苹果装入10个盒子中,使得用户无论购买多少个苹果(1-1000),都能由若干个盒子拼装而成(卖的时候是整个盒子卖,不能拆盒子的包装)解法:考虑1, 2, 4, 8这四个数,由这四个数可以组成1-15之间任意一个数,也即1,2, 4 ... 2n 可以组成1-2(n+1)-1之间所有的数。所以这十个盒子分别放入1, 2, 4,原创 2016-12-24 20:02:52 · 1833 阅读 · 0 评论 -
找完全二叉树最底层最右边的结点
题目:用log(n)算法 找完全二叉树最底层最右边的结点一颗二叉树的总结点其实是知道的,设为N。如上图,总共有15个结点,那么找15号结点只需从根结点开始,向右--向右--向右。假设只有14个点,那么向右--向右--向左假设只有13个结点,那么向右---向左---向右…………可以找到规律,总结点数即为最后一个结点,也就是我们要找的原创 2016-12-24 20:04:56 · 2360 阅读 · 0 评论 -
树中的最长路径
题目N个结点,用(N-1)个线段连接起来,组成一棵树。这棵树中距离最远的两个结点之间相隔的距离。注意:是任意两个结点的最远距离,不是树的深度。解法这个题目很像二叉树中,求距离最远的两个结点的距离。在求解时,递归求解每个结点的最大深度,假设左子树深度为L,右子树深度为R,那么经过这个结点的,且以这个结点为根节点的子树中,最远两个结点的距离为L+R。且其父节点的左子原创 2016-12-25 16:06:18 · 7274 阅读 · 1 评论 -
经典算法题目:Cracking the coding interview 问题与解答
Cracking the coding interview--问题与解答March 14, 2013作者:Hawstein出处:http://hawstein.com/posts/ctci-solutions-contents.html声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注转载 2016-10-31 00:39:47 · 7027 阅读 · 0 评论 -
经典算法题:无序整数数组中找第k大的数
经典问题:写一段程序,找出数组中第k大的数,输出数所在的位置。【解法一】先排序,然后输出第k个位置上的数我们先假设元素的数量不大,例如在几千个左右,在这种情况下,那我们就排序一下吧。在这里,快速排序或堆排序都是不错的选择,他们的平均时间复杂度 都是 O(N * logN)。然后取出前 K 个,O(K)。总时间复杂度 O(N * logN)+ O(K) = O(N * logN)。你原创 2016-10-27 21:02:19 · 37489 阅读 · 5 评论 -
经典算法题:大数据处理常见算法题
第一部分、十道海量数据处理1、海量日志数据,提取出某日访问百度次数最多的那个IP。 此题,在我之前的一篇文章算法里头有所提到,当时给出的方案是:IP的数目还是有限的,最多2^32个,所以可以考虑使用hash将ip直接存入内存,然后进行统计。 再详细介绍下此方案:首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中。注意到IP是32位的,最多有个2^32个IP。同转载 2016-11-01 18:08:24 · 25216 阅读 · 2 评论