Algorithm
universe_ant
这个作者很懒,什么都没留下…
展开
-
【腾讯笔试】满二叉排序树中查找三个节点的最小子树的根节点
题目:一个满二叉排序树深度为k,结点数为2^k-1;节点值为1至(2^k-1),给出k和任意三个节点的值,输出包含该三个节点的最小子树的根节点。样例输入:4 10 15 13样例输出:12首先,我们来理解一下满二叉排序数,如下就是一个4层的满二叉排序树:* 8* / \* 4 12* / \ / \*转载 2017-08-29 23:19:34 · 1340 阅读 · 0 评论 -
旋转数组的二分查找
1.问题描述已知有序数组a[N],从中间某个位置k(k未知,k=-1表示整个数组有序)分开,然后将前后两部分互换,得到新的数组,在该新数组的查找元素x。如:a[]={1, 2, 5, 7, 9, 10, 15},从k=4分开,得到新数组a[]={9, 10, 15, 1, 2, 5, 7}。:二分查找算法有两个关键点:1)数组有序;2)根据当前区间的中间元素与x的大小关系,确定下次转载 2017-07-19 21:35:27 · 991 阅读 · 0 评论 -
华为机试题-合唱队
题目:计算最少出列多少位同学,使得剩下的同学排成合唱队型。说明:N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。合唱队型是指这样的一种队型:设K位同学从左到右依次编号为1,2,……,K,他们的身高分别为T1,T2,……,TK,则他们的身高满足存在i(1Ti+1>……>TK。你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使原创 2017-07-23 17:19:43 · 860 阅读 · 0 评论 -
[LeetCode] Rotate Image
题目:You are given an n×n 2D matrix representing an image.Rotate the image by 90 degrees (clockwise).Follow up: Could you do this in-place?分析:要达到in-place的要求,我们采用交换的方法,顺序是左上先和左下交换,然后左上和右下交换原创 2017-07-19 11:45:55 · 228 阅读 · 0 评论 -
[LeetCode] Rotate List
题目:Given a list, rotate the list to the right by k places, where k is non-negative.For example, Given 1->2->3->4->5->NULL and k = 2, return4-> 5->1->2->3->NULL.分析:该题的关键在于如何找到链表后半部分原创 2017-07-19 11:23:14 · 244 阅读 · 0 评论 -
[LeetCode] Rotate Array
题目:Rotate an array of n elements to the right by k steps.For example, with n = 7 and k = 3, the array [1, 2, 3, 4, 5, 6, 7] is rotated to [5, 6, 7, 1, 2, 3, 4].分析:首先我们将整个数组反转,然后将前k个数字反原创 2017-07-19 10:39:19 · 234 阅读 · 0 评论 -
[LeetCode] Max Points on a Line
题目:Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.分析:一个点加一个斜率,就可以唯一的确定一条直线。所以我们对每个点,都计算一下该点和其他点连线的斜率,这样对于这个点来说,相同斜率的直线有多少条,就意味着有多少个点在同一条直线原创 2017-07-18 23:57:17 · 224 阅读 · 0 评论 -
[LeetCode] Add Two Numbers
题目:You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a原创 2017-07-18 22:04:36 · 255 阅读 · 0 评论 -
从矩阵左上角到右下角的最大值
题目:输入一个矩阵num[m][n],现在从左上角到达右下角,且只能向下或者向右走。我们要求的是路径经过的所有点的数字之和的最大值。分析:方法一、采用DFS的思想import java.util.*;public class MaxMatrixPathSum { private static int M; private static int N; private原创 2017-07-20 10:36:43 · 4930 阅读 · 0 评论 -
判断两个矩阵是否重叠
判断两个矩阵是否重叠关于如何判断两个矩阵是否重叠,这是我在实际项目开发当中曾经遇到过的问题:“判断图像中检测到的两个人脸框矩形是否有重叠部分,并计算重叠大小,从而确认是否为同一个人脸”。后来,在浏览博客时,也发现有人将这个问题当做面试题目,并进行讨论,但是,列出的代码过于繁杂,不敢恭维。所以,写下这篇博文,并贴出代码,供大家参考。前提两个矩阵的边均与x轴和y轴平行,即轴对齐的矩转载 2017-07-20 16:04:29 · 7841 阅读 · 2 评论 -
[LeetCode] LRU Cache
题目:Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get and set.get(key) - Get the value (will always be positive) of the原创 2017-07-18 18:11:15 · 296 阅读 · 0 评论 -
GeoHash算法原理及实现方式
一、GeoHash特点首先,GeoHash用一个字符串表示经度和纬度两个坐标。某些情况下无法在两列上同时应用索引(例如MySQL 4之前的版本,Google App Engine的数据层等),利用GeoHash。只需要在一列上应用索引即可。其次,GeoHash表示的并不是一个点,而是一个矩形区域。比如编码wx4g0ec19,它表示的是一个矩形区域。使用者可以发布地址编码,既能表明自己位于北原创 2017-07-08 13:53:20 · 11712 阅读 · 2 评论 -
剑指Offer——丑数
题目:丑数我们把只包含因子2,3,5的数称为丑数(Ugly Number)。求按从小到大的顺序的第1500个丑数。例如,6、8都是丑数,但14不是,因为它含有因子7。习惯上我们把1当作第一个丑数。思路:根据丑数的定义,丑数应该是另一个丑数乘以2、3或5的结果。因此我们可以创建一个数组,里面的数字是排序好的丑数,每一个丑数都是前面的丑数乘以2、3或5得到的。这种思路的转载 2017-06-15 12:04:01 · 332 阅读 · 0 评论 -
剑指Offer——二叉树中和为某一值的路径
题目:输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的所有的节点形成一条路径。输入如下图的二叉树和整数22,则打印出两条路径,第一条路径包含节点10,12,第二条路径包含的节点为10,5,7。一般的数据结构和算法的教材都没有介绍树的路径,因此对很多人而言,这是一个新概念,也就很难一下子想出完整的解题转载 2017-06-15 11:00:25 · 373 阅读 · 0 评论 -
[LeetCode] Search Insert Position
题目:搜索插入位置Given a sorted array and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order.You may assume no duplicate原创 2017-07-19 22:07:54 · 292 阅读 · 0 评论 -
邮箱的正则表达式
邮箱的一般格式为:名称@域名。我们这里需要匹配的邮箱中名称可以包含汉字、字母、数字,域名只允许为英文和数字。例如:张三zs333@domain.com邮件名称部分:汉字在正则中表示为[\u4e00-\u9fa5]字母和数字表示为A-Za-z0-9因此邮件名称部分的正则表达式整理如下:[A-Za-z0-9\u4e00-\u9fa5]+邮件域名部原创 2017-07-19 22:41:35 · 28513 阅读 · 4 评论 -
【剑指Offer】最小的k个数
题目:输入n个整数,找出其中最小的k个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。这道题最简单的思路莫过于把输入的n个整数排序,排序之后位于最前面的k个数就是最小的k个数。这种思路的时间复杂度是O(nlogn),面试官会提示我们该有更快的算法。 解法一:O(n)的算法,只有当我们可以修改输入的数组时可用我们可以基于Partition函数来原创 2017-08-28 17:35:29 · 619 阅读 · 0 评论 -
【剑指Offer】树的子结构
题目:输入两棵二叉树A和B,判断B是不是A的子结构。代码:class TreeNode { int data; TreeNode left; TreeNode right;}public class SubTree { /** * 第一步:在树A中找到和B的根节点的值一样的节点R * 第二步:再判断树A中以R为根节点的子树是不是包含和树B一样的结构 */原创 2017-09-13 21:20:42 · 460 阅读 · 0 评论 -
【剑指Offer】连续子数组的最大和
题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为{1, -2, 3, 10, -4, 7, 2, -5}。看到题目,很多人都能想到最直观的方法,即枚举出数组的所有子数组并求出它们的和。一个长度为n的数组,总共有(n*(n+1))/2个子数组。计算出所有的子数组的和,最快也要O(n^2原创 2017-08-28 13:07:20 · 371 阅读 · 0 评论 -
归并排序的Java实现
题目:对于一个int数组,请编写一个归并排序算法,对数组元素排序。给定一个int数组A及数组的大小n,请返回排序后的数组。算法思路:先用递归方法,默认排序方法为2路归并排序。看下图应该能立即理解:先使每个子序列有序,再将两个已经排序的序列合并成一个序列的操作。若将两个已经排序的有序表合并成一个有序表,称为二路归并。public cla原创 2017-06-09 11:39:56 · 357 阅读 · 0 评论 -
求两个排序数组的中位数
题目:给定两个排序数组,求两个排序数组的中位数,要求时间复杂度为O(log(m+n))。举例:Example 1:nums1 = [1, 3]nums2 = [2]The median is 2.0Example 2:nums1 = [1, 2]nums2 = [3, 4]The median is (2 + 3)/2 = 2.5转载 2017-06-09 09:52:57 · 691 阅读 · 0 评论 -
大数相加-Java版
package po.ag;public class BigIntegerAdd { /** * 超大数相加 * @param num1 * @param num2 * @return */ public static String bigNumerSum(String num1, String num2) { char sign = '+'; char sig原创 2017-06-01 02:14:51 · 570 阅读 · 0 评论 -
给定一个有环链表,实现一个算法返回环路的开头结点
检测链表是否存在环路有一种简单的做法叫FastRunner/SlowRunner法。FastRunner一次移动两步,而SlowRunner一次移动一步。这就好比两辆赛车绕着同一条赛道以不同的速度前进,最终必然会碰到一起。聪明的读者可能会问:FastRunner会不会刚好“越过”SlowRunner,而不发生碰撞呢?绝无可能。假设FastRunner真的越过了SlowRunner,且Slo转载 2017-04-17 20:25:39 · 1272 阅读 · 0 评论 -
最长公共子序列以及最长公共子字符串
问题描述:子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串:cnblogsbelong比如序列bo、bg、lg在母串cnblogs与belong中都出现过并且出现顺序与母串保持一致,我们将其称为公共子序列。最长公共子序列(Longest Common Subsequence,LCS),故名思义,是指在所有的子序列中最长的一个。子串是要求更严格的一种子序列,要求在母转载 2017-08-16 23:39:58 · 356 阅读 · 0 评论 -
冒泡排序及其优化
冒泡排序的思想是蛮力法。冒泡,顾名思义,每次选择后面一个元素(最大或者最小)冒上来,从而得到一个有序的序列。public class BubbleSort { public void bubbleSort(int[] array) { int len = array.length; for(int i = 0; i < len - 1; i++) {原创 2017-07-09 16:25:36 · 271 阅读 · 0 评论 -
网易笔试题:男女小孩站队问题
题目描述:幼儿园有n个小朋友排为一个队伍,男生用“B”表示,女生用“G”表示。当男女同挨着时就会发生矛盾。需要对所排的队伍进行调整,每次调整只能让相邻的小朋友交换位置,现在需要尽快完成队伍调整,你需要计算出最少需要调整多少次可以让上述情况最少。例如:GGBBG->GGBGB->GGGBB,这样就能使之前的两处男女相邻变为一处男女相邻,需要调整队形两次。程序输入:输入一个数据包括一个转载 2017-06-19 00:43:07 · 1719 阅读 · 0 评论 -
【Leetcode】Decode Ways 解码方式
题目:A message containing letters from A-Z is being encoded to numbers using the following mapping:'A' -> 1'B' -> 2...'Z' -> 26Given an encoded message containing digits, determine the total n转载 2017-06-15 23:19:02 · 481 阅读 · 0 评论 -
Worm(毛毛虫)HDU2151
问题描述:自从见识了平安夜苹果的涨价后,Lele就在他家门口水平种了一排苹果树,共有N棵。突然Lele发现在左起第P棵树上(从1开始)有一条毛毛虫。为了看到毛毛虫变蝴蝶的过程,Lele在苹果树旁观察了很久。虽然没有看到蝴蝶,但Lele发现了一个规律:每过一分钟,毛毛虫便会随机从一棵树爬到相邻的一棵树上。比如刚开始毛毛虫在第2棵树上,过一分钟后,毛毛虫可能会在第1棵树上或者第3棵树上,如原创 2017-08-13 11:54:23 · 1435 阅读 · 2 评论 -
华为机试题—0交换排序
题目描述:长度为n的数组乱序存放着0至n-1,现在只能进行0与其他数的交换,完成以下函数。public class Solution { /** * 交换数组里n和0的位置 * * @param array * 数组 * @param len * 数组长度 * @pa原创 2017-08-09 09:53:00 · 14259 阅读 · 2 评论 -
【Java实现】判断一棵树是否为BST,一棵树是否为完全二叉树
给定一个二叉树,判断它是不是二叉搜索树。思路:对于一棵二叉树,最简单的方法就是中序遍历,看是不是一个递增数列,如果是,则是一棵二叉搜索树,如果不是,则不是二叉搜索树。在这里用一个lastVisit去记录上一次搜索的节点。这个过程就是先找到最左下角的节点,更新lastVisit为这个节点的值,然后按照中序遍历依次更新即可。代码:class Node { int data; Node原创 2017-06-15 01:30:39 · 6023 阅读 · 0 评论 -
剑指Offer——计算1至n中数字x出现的次数
一、1的数目编程之美上给出的规律:1. 如果第i位(自左至右,从1开始标号)上的数字为0,则第i位可能出现1的次数由更高位决定(若没有高位,视高位为0),等于更高位数字乘以当前位数的权重10^(i-1)。2. 如果第i位上的数字为1,则第i位上可能出现1的次数不仅受更高位影响,还受低位影响(若没有低位,视低位为0),等于更高位数字乘以当前位数的权重10^(i-1) + (低位数字+1)转载 2017-06-14 22:53:22 · 804 阅读 · 0 评论 -
【LintCode】最长上升序列(Longest Increasing Sequence)
题目:给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度。样例 给出[5, 4, 1, 2, 3],这个LIS是[1, 2, 3],返回3 给出[4, 2, 4, 5, 3, 7],这个LIS是[4, 4, 5, 7],返回4挑战 要求时间复杂度为O(n^2)或者O(nlogn)说明 最长上升子序列的定原创 2017-07-04 10:53:15 · 723 阅读 · 0 评论 -
MySQL索引背后的数据结构及算法原理
摘要本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论。文章主要内容分为三个部分:第一转载 2017-03-01 21:38:19 · 300 阅读 · 0 评论 -
堆和优先队列
0、引言在许多问题中,当对数据集进行频繁的插入和删除操作时,往往需要快速确定最大或最小的元素。处理这种问题的方法之一,就是使用一个已排好序的数据集。通过这种方法,最大或最小元素总是处在数据集的头部(这取决于使用升序还是降序排列)。然而,将数据集一遍又一遍地进行排序的代价是非常高的。并且很多情况下,将元素排序并不是操作的目的,最终我们可能在真正要做的工作之外做了很多其他的工作。想要快速地找到最大原创 2016-12-09 17:00:34 · 611 阅读 · 0 评论 -
树
0、引言家族族谱、比赛的对阵表等,这些都是关于按照树形结构组织数据的绝好例子。在计算机科学中,树由称为结点的元素按照层次结构的方式组织而成。层次结构最顶端的结点称为根。与根节点直接相连的结点称为根的子结点,通常子结点本身也有属于它自己的子结点。除了根结点外,在这个层次体系中的每个结点都有唯一的父结点,也就是与其直接相连的上级结点。一个结点拥有多少个子结点取决于树的类型,这个量值称为树的分支因子原创 2016-12-08 23:46:48 · 623 阅读 · 0 评论 -
哈希表
0、引入哈希表支持一种最有效的检索方法:散列。从根本上来说,一个哈希表包含一个数组,通过特殊的索引值(键)来访问数组中的元素。哈希表的主要思想是通过一个哈希函数,在所有可能的键与槽位之间建立一张映射表。哈希函数每次接受一个键将返回与键相对应的哈希编码或哈希值。键的数据类型可能多种多样,但哈希值的类型只能是整型。由于计算哈希值和在数组中进行索引都只消耗固定的时间,因此哈希表的最大亮点在于它是原创 2016-12-07 17:26:42 · 4875 阅读 · 1 评论 -
集合
0、引入集合是不同对象(称为成员)的无序聚集。由于元素之间彼此相关联,因此可以理解为归聚在一起的成员组合。集合的两个重要特点是:第一,成员是无序的;第二,每个成员在集合中出现一次。集合是离散数学中的重要部分,离散数学与计算机科学之间有着很深的渊源。在计算机科学中,我们使用集合来归类数据,尤其是当我们计划以后将其与其他数据相关联时。一些编程语言比如Pascal原生支持集合,但C语言本身并没有这种原创 2016-12-05 17:35:45 · 826 阅读 · 0 评论 -
栈和队列
0、引入通常来说,决定采用何种方式来存储数据是非常重要的,这样便于稍后检索数据时,数据会自动按照某种规定的顺序给出。用于检索数据的一种常用结构称为栈,它检索元素的顺序与存储元素的顺序相反。例如:一个记录函数调用轨迹的数据块。这些数据块称为活跃记录。有一个函数集{f1, f2, f3},其中f1调用f2,f2调用f3,每次当函数调用发生时,程序就会分配空间来记录此激活信息。这些记录会一直存在直到原创 2016-12-04 16:38:57 · 399 阅读 · 0 评论 -
链表
0、引入链表可以说是一种最为基础的结构。链表是由一组元素以一种特定的顺序组合或链接在一起,在维护数据的集合时很有用。这一点同我们常用到的数组很相似。然而,链表在很多情况下比数组更有优势。特别是在执行插入和删除操作时链表拥有更高的效率。链表需要动态地开辟存储空间,也就是存储空间是在程序运行时分配的。由于在很多应用中数据的大小在编译时并不能确定,因此这种动态分配空间的特性也是链表的一个优点。原创 2016-12-03 22:26:30 · 616 阅读 · 0 评论 -
递归
0、引入递归是一种强大的方法,它允许一个对象以其自身更小的形式来定义自己。恐怕没有什么比观察神秘的自然界中出现的递归现象更好的方法来体会递归的重要意义了。想想蕨类植物的叶子,每片叶子叶脉中的小分支都是整片叶子的较小缩影;又或者两个反光的物体,相互映射对方渐远的影像。这样的例子使我们明白尽管大自然的力量是强大的,在许多方面它那种出乎意料的简洁更让我们觉得优美。同样的道理也可用在递归算法上,从很多原创 2016-12-01 15:32:46 · 471 阅读 · 0 评论