经典算法
文章平均质量分 89
qiki_tang
不积硅步无以至千里,突破自己,糖没味儿加油!
展开
-
字符串的旋转--3步翻转法
问题描述 给定一个字符串,要求将字符串前面的若干字符移到字符串的尾部。例如: 将字符串“abcdef”的前3个字符’a’、’b’和’c’移到字符串的尾部,那么原字 符串将变成“defabc”,请写一个函数实现此功能.思路:可通过三步翻转的方法实现step1:将原字符串分成两部分,一部分是字符串前面的“若干字符”X,另一部分是除了X的Y;step2:将X的所有字符翻转,即上面所说原创 2017-12-01 22:21:30 · 771 阅读 · 0 评论 -
跳台阶问题
问题描述一个台阶总共有n级,如果一次可以跳1级,也可以跳2级,求总共有多少种跳法方法1-递归通过枚举可以发现:台阶级数和跳法有如下关系 级数 0 1 2 3 4 5 6 7 8 跳法 0 1 2 3 5 8 13 21 35…从这个规律来看,可以发现,从第三级开始,跳法是一个斐波拉契数列递归代码/**************************Author:tmwdate:2017-原创 2017-11-24 11:40:50 · 272 阅读 · 0 评论 -
14-奇偶数排序
问题描述 给定一个整数数组,请调整数组中数的顺序,使得所有奇数位于数组的前半分,>所有的偶数位于数组的后半部分,要求时间复杂度为O(n)。方法1-1次快排-两头往中间搜索结合快速排序的思想:一次快排能将小于中轴元素的值全放左边,大于中轴元素的值全放右边,那么推而言之,一次快排,也可以让所有奇数位于前半部分,所有偶数位于后半部分。下面的代码用的方法是一次快排中的“两头往中间搜索”的方法。/***原创 2017-11-24 18:38:26 · 458 阅读 · 0 评论 -
荷兰国旗
问题描述 现有n个红白蓝三种不同个颜色的球,乱序排在一起,请通过两两交换任意两个球,使得从左到右的球依次是红球、白球、篮球。方法1-无差别2次快排可以将红白蓝三种球分别标号为1、2、3,相当于1、2、3是乱序的, 需要将它们排列成1..1、2….2、3…3 照此情况,两次无差别的快排(不关心元素的特殊性–只有1、2、3三个元素,只需要它们从小到大排列出来)完全是可以办到的。下面的代码是 无原创 2017-11-25 11:34:55 · 320 阅读 · 0 评论 -
【二分查找】原型和变种以及相关思考
一、写在前面的话笔者在面一家非常NB的互联网公司时,面到了二分查找的变种题,回来后对这个看似简单的二分查找做了深入的思考,可能也不算深入,但至少比之前是更加领教了它的厉害。每一次面试都会带来不一样的思维启迪,面完这家公司带给我最大的启迪就是学算法不止学它本身,应该看到它的边界和可扩展性,经常想想这些好的经典算法,让它融入到自己潜意识里,才算真正掌握。话不多说,开始上干货。二、二分查找原型...原创 2018-09-07 08:50:50 · 842 阅读 · 0 评论 -
约瑟夫环问题--非链表解法
一、问题描述 n个数字,[0,n-1],连成环,从第1个数开始,找到第m个数,删除,然后从删除后的下一个数开始继续数第m个数删除,问最后剩下哪个数二、解法 1、通过设定状态标志位,(声明一个状态数组status[N],status[i]==0时表示未出圈,出圈时将对应第i号人的status置为出圈的次数;即status[i]=count) 2、循环条件是:当count值在N范围内...原创 2018-04-27 16:12:55 · 305 阅读 · 0 评论 -
51-【巧解】统计无序数组各元素出现的次数--时间复杂度O(n),空间复杂度O(1)
一、问题描述【题型一】一个长度大小为n的数组,数组中的每个元素的取值范围在[1,n],且为正整数。问:如何在时间复杂度为O(n),空间复杂度为O(1)的条件下,统计数组中不同元素出现的次数。【题型二】在一个长度为n的数组里的所有数字都在0-n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。【例如】如果...原创 2018-04-27 16:38:30 · 3235 阅读 · 0 评论 -
IP地址CIDR合法性校验
一、问题描述 我们一般用CIDR来表示一段ip地址。CIDR是这样一个字符串:先是一个ipv4的地址的字符串表示,加一个”/“分隔符,再加一个13(含)到27(含)之间的整数。比如“192.128.1.134/25”,表示从192.128.1.128(含)到192.128.1.255(含)的128个ip地址。 “/”前的字段“192.128.1.134”表示该范围内的一个ip地址(不一...原创 2018-04-27 16:46:41 · 7189 阅读 · 0 评论 -
28-n皇后问题
leetcode52. N-Queens II一、问题描述n皇后拼图是将n个皇后放在n * n棋盘上的问题,使得没有两个皇后互相攻击--不能同行同列同斜线。【需求】给定一个整数n,返回n皇后拼图的所有不同的解决方案。每个解决方案都包含n皇后位置的独特摆放情况,其中'Q'和'.' 两者分别指示女王和空闲空间。【举例】输入: 4 ------------- 输出: 2[ [".Q..", //...原创 2018-05-14 11:14:05 · 253 阅读 · 0 评论 -
洗牌算法
问题描述 有一个长度为2n的数组{a1,a2,a3,…an,b1,b2,b3,…,bn},希望排序后变成{a1,b1,a2,b2,…,an,bn},请考虑有没有时间复杂度为O(n),空间复杂度为O(1)的解>法此问题将时间复杂度和空间复杂度都定死了,笔者为了满足这个要求废了不少脑细胞也—没想出来。。现暂时抛开复杂度设定,从简单易实现的解法出发,先实现一个时间复杂度为O(n^2),空间复杂度为O原创 2017-12-01 22:15:25 · 388 阅读 · 0 评论 -
31-最大连续子数组和
问题描述 给定一个整数数组,数组里可能有正数、负数和0。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。方法1–暴力搜索从数组位置0出发,依次顺序递加后,和值的最大值` 从数组位置1出发,依次顺序递加后,和值在前两轮最大值(因为满足最大条件后,最大值才更新;……直到遍历到数组最后一个位置numSize-1 ,和值在前num...原创 2017-11-21 15:57:51 · 810 阅读 · 0 评论 -
最优二叉树---哈弗曼树及哈夫曼编码
【算法】哈夫曼树----最优二叉树--概念--从树中一个结点到另一个结点之间的分支构成两个节点之间的路径,路径上分支数目称作路径长度树的路径长度就是从树根到每一结点的路径长度之和结点的带权路径长度是从结点到树根之间的路径长度与结点上权值的乘积,树的带权路径长度是树中所有叶子结点的带权路径长度之和带权路径长度WPL最小的二叉树称为哈夫曼树下面演示了用哈夫曼算法构造一棵哈夫曼树及哈夫曼编码的过程--哈...原创 2017-10-18 18:30:15 · 704 阅读 · 0 评论 -
字符串包含类问题
问题描述 给定两个字符串a和b,一长一短,如何快速判断短字符串b中所有元素都在长字符串a中?这里假设字符串中的元素都为大写字母 【例 如】 1) a = “ABCD”,b = “DBA”,返回true 2) a = “ABCD”,b = “AAD”,返回true 3) a = “ABCD”,b = “BCE”,返回false算法的本质在于用更小的时间消耗获得同样的效果,原创 2017-11-07 18:07:53 · 239 阅读 · 0 评论 -
28-字符串全排列问题
问题描述 打印给定字符串的所有排列情况。 例如 输入字符串‘abc’,则打印出它的全排列形式: abc acb bac bca cab cba 【注意】写算法时要考虑到有相同元素的情况: 输入字符串‘aab’,它的全排列打印应该为 aab aba baa 所以,设计的算法应该对没有重复元素和有重复元素这两种情况有区分方法一:递归实现先确定一个数作为排列的第一个原创 2017-11-12 21:24:10 · 551 阅读 · 0 评论 -
字符串转换成整数
问题描述 输入一个由数字组成的字符串,把它转换成整数并输出。问题分析编写代码前,应结合题意考虑以下几点:输入参数合法性验证 1) 题目有说字符串由数字组成,但没说清楚数字之间是否有空格—(空格在这里视为非法字符) 2) 输入是否为空串特殊情况讨论 3) 字符串的正负性 4) 转换成整数后,是否会造成溢出从前往后遍历还原整数 思考:在实际考虑中,...原创 2017-11-13 17:37:47 · 339 阅读 · 0 评论 -
30-寻找最小的k个数
问题描述 有n个整数,找出其中最小的k个数,时间复杂度尽可能低解决这道问题有很多种方法,最常见的解法笔者认为有两大类,第一类是全排序,第二类是部分排序。 1. 在全排序中,复杂度较低的,对于数量比较大的数据集而言,可以考虑采用快速排序和堆排序,复杂度O(nlogn)。对于数量比较小的数据集而言,可以考虑其他排序方式,比如插入排序。 2. 对于部分排序,题目没有要求最小的k个数有序,也没有要原创 2017-11-18 12:24:51 · 784 阅读 · 0 评论 -
回文判断
问题描述 给定一个字符串,判断这个字符串是否是回文回文的特点在于对称性,针对这个性质,笔者想到的方法有: 1)两头到中间 2)中间到两头 3)recerse前后判断 4)栈下面,笔者将分别这四种方法用代码的形式实现1. 两头到中间算法思想头、尾指针分别指向字符串的首元素和尾元素,逐一比较,若有不同,则返回false,程序退出。直到头尾指针指向同一个中间元素,算法终止。时间复杂度为O(n原创 2017-11-13 22:31:15 · 1033 阅读 · 0 评论 -
寻找和为定值的两个数
寻找和为定值的两个数1、问题描述插入一个整数数组和一个整数,在数组中查找一对数,满足它们的和正好是输入的那个整数。如果有多对数的和等于输入的整数,输出任意一对即可。2、解法一:构建哈希表针对本题,除了排序以外,笔者比较容易想到的方法是构建哈希表。下面对这个算法进行描述:算法准备:将插入的整数数组构建成哈希表--在构建哈希表时,笔者采用取余的方法构建哈希函数,采用链表法避免冲原创 2017-11-19 21:47:17 · 459 阅读 · 0 评论 -
最长回文子串
问题描述 给定一个字符串,求它的最长回文子串的长度方法1-最长优先遍历算法思想 针对这个问题,笔者最先想到的方法是以最长长度(即字符串本身长度)开始,从头到尾遍历以长度为单位遍历字符串,一旦不符合回文匹配,则跳出字符串遍历。继续走最外层循环–即将遍历长度逐次减一,直到遍历长度减到2为止,若找到,返回最外层循环长度,若没找到,则返回0,程序结束。复杂度分析 本算法最好的情况就是,一开始原创 2017-11-15 11:32:14 · 700 阅读 · 0 评论 -
寻找和为定值的k个数
寻找和为定值的k个数问题描述输入两个整数n和sum,要求从正整数数列中随意取出几个数,使得它们的和等于sum,将其中所有可能的组合列出来解法:递归法此题是在n个数中找和为sum的任意组合,那么可以将问题转化为:1)若选第n个数,则在剩余的n-1个数中找和为sum-val(n)的数2)若不选第n个数,则在剩余的n-1个数中找和为sum的数这里的n是不定的,所以当代码层层递归...原创 2017-11-21 12:30:27 · 1031 阅读 · 1 评论 -
两个排序数组中找第k大的数
一、题目描述给定两个已经排序好的数组,找到两者所有元素中第k大的元素二、解法分析解法一:参照归并排序 将两个有序数组变成一个有序数组:merge两个数组,然后求第k大的数,时间复杂度O(m+n)解法二:游标计数 题目只要求第k大的数,没必要花力气将数组全部再排序,可以定义两个游标分别指向两个有序数组,按序移动,并用count计数,当count等于k时,返回两个游标指向的数中最小的那一个...原创 2018-07-08 11:32:18 · 9980 阅读 · 4 评论