算法
huzhigenlaohu
这个作者很懒,什么都没留下…
展开
-
剑指offer-数组中出现次数超过一半的数字
数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。基本上有三种思路首先对数组排序,然后统计某个数出现的次数,发现超过数组长度一半就返回结果求出数组中最大数,然后声明一个额外的数组counts,数组大小为最大原创 2016-06-27 19:26:55 · 486 阅读 · 0 评论 -
Largest Rectangle in Histogram(在柱形图中画出最大矩形)
Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.Above is a histogram where width转载 2016-08-18 11:20:26 · 675 阅读 · 0 评论 -
LeetCode OJ 之 Maximal Rectangle (最大的矩形)
题目:Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area.给一个二维的二进制矩阵,只包含0和1,找出只包含1的最大矩形并且返回这个矩形的面积。思路:本题通过下图变换可以转换为求 :Lee转载 2016-08-18 15:34:25 · 2104 阅读 · 1 评论 -
[Leetcode] Maximal Square 最大正方形
题目:Given a 2D binary matrix filled with 0's and 1's, find the largest square containing all 1's and return its area.For example, given the following matrix:1 0 1 0 01 0 1 1 11 1 1 1 1转载 2016-08-18 16:00:14 · 1056 阅读 · 0 评论 -
google笔试题 -- 根据已知数列得到不能组合求和的最小数
开始是Google笔试题 https://code.google.com/codejam/contest/4244486/dashboard#s=a&a=2 (翻墙看)网易笔试也出现了,如下:小易邀请你玩一个数字游戏,小易给你一系列的整数。你们俩使用这些整数玩游戏。每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字。 例如: 如果{2,1,2原创 2016-08-18 21:31:11 · 1069 阅读 · 0 评论 -
网易笔试题--幸运袋子(数列各项和大于数列各项乘积)
一个袋子里面有n个球,每个球上面都有一个号码(拥有相同号码的球是无区别的)。如果一个袋子是幸运的当且仅当所有球的号码的和大于所有球的号码的积。例如:如果袋子里面的球的号码是{1, 1, 2, 3},这个袋子就是幸运的,因为1 + 1 + 2 + 3 > 1 * 1 * 2 * 3你可以适当从袋子里移除一些球(可以移除0个,但是别移除完),要使移除后的袋子是幸运的。现在让你编程计算一下你可以原创 2016-08-20 22:23:13 · 2273 阅读 · 3 评论 -
网易笔试题--混合颜色(异或)
你就是一个画家!你现在想绘制一幅画,但是你现在没有足够颜色的颜料。为了让问题简单,我们用正整数表示不同颜色的颜料。你知道这幅画需要的n种颜色的颜料,你现在可以去商店购买一些颜料,但是商店不能保证能供应所有颜色的颜料,所以你需要自己混合一些颜料。混合两种不一样的颜色A和颜色B颜料可以产生(A XOR B)这种颜色的颜料(新产生的颜料也可以用作继续混合产生新的颜色,XOR表示异或操作)。本着勤俭节原创 2016-08-20 23:23:17 · 2599 阅读 · 0 评论 -
矩阵连乘-动态规划-(只是感觉描述的清晰易懂,并不是什么新算法)
矩阵连乘-动态规划-详解DEC 19TH, 2015 11:04 AM动态规划法以矩阵链ABCD为例按照矩阵链长度递增计算最优值矩阵链长度为1时,分别计算出矩阵链A、B、C、D的最优值矩阵链长度为2时,分别计算出矩阵链AB、BC、CD的最优值矩阵链长度为3时,分别计算出矩阵链ABC、BCD的最优值矩阵链长度为4时,计算出矩阵链ABCD的最优值转载 2016-08-11 15:20:05 · 2129 阅读 · 0 评论 -
回溯法求解N皇后问题
回溯法:也称为试探法,它并不考虑问题规模的大小,而是从问题的最明显的最小规模开始逐步求解出可能的答案,并以此慢慢地扩大问题规模,迭代地逼近最终问题的解。这种迭代类似于穷举并且是试探性的,因为当转载 2016-08-12 10:13:15 · 872 阅读 · 0 评论 -
回溯法求迷宫问题
并不是什么新鲜算法,只是这儿当作回溯法经典案例复习下而已!以一个M×N的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。(1) 根据二维数组,输出迷宫的图形。(2) 探索迷宫的四个方向:RIGHT为向右,DOWN向下,LEFT向左,UP向上,输出从入口到出口的行走路径。[测试数据转载 2016-08-12 10:52:37 · 1151 阅读 · 0 评论 -
根据入栈顺序判断出栈序列正确与否
题目描述: 题目标题:铁路栈问题铁路的调度站如下:火车编号为:1~9,且不重复。如:编号分别为“1”、“2”、“3”、“4”、“5”的5个火车顺序进站,那么进站序列为“12345”,全部进站后再顺序出站,则出站序列为“54321”,如果先进1,2,然后2出站,然后1出站,然后再3进站、出站,4进站、出站,5进站、出站,那么出站序列就为21345.详细原创 2016-08-12 15:51:10 · 2259 阅读 · 0 评论 -
基于单链表的快排实现
快排最核心的思想就是划分,确定一个枢轴元素(pivot),每一趟划分的目的就是把待排序列分为两部分,前一部分比枢轴小(序列A),后一部分比枢轴大(序列B)。经过一趟划分之后序列变为:{A} pivot {B}。以下是具体步骤:1、确定每一次划分的枢轴元素为当前待排序列的头节点。2、设置Slow和Fast两个游标,Slow指向序列A中的最后一个元素,初始化为枢轴本身(待排序列头节点)。让Fa原创 2016-09-03 20:30:55 · 1427 阅读 · 0 评论 -
和尚挑水(回溯法)
复习回溯法题目某寺庙里7个和尚:轮流挑水,为了和其他任务不能冲突,各人将有空天数列出如下表:和尚1: 星期二,四;和尚2: 星期一,六;和尚3: 星期三,日;和尚4: 星期五;和尚5: 星期一,四,六;和尚6: 星期二,五;和尚7: 星期三,六,日;请将所有合理的挑水时间安排表 思路 回朔法求解回朔法即每进行一步,都试图在当前部分解的基础上扩大转载 2016-08-13 10:01:19 · 935 阅读 · 0 评论 -
整数划分总结(动态规划)
先引入一个比较实际的问题:分苹果题目M个相同苹果放到N个相同篮子里有多少种放法,允许有篮子不放。1<=M<=10,1<=N<=10例如5个苹果三个篮子,3,1,1 和 1,1,3是同一种放法输入 7 3输出 8思路设f(m,n) 为m个苹果,n个盘子的放法数目:当n>m:必定有n-m个盘子永远空着,去掉它们对摆放苹果方法数目不产生原创 2016-08-13 11:23:52 · 4818 阅读 · 0 评论 -
【分治法】最接近点对问题
问题场景:在应用中,常用诸如点、圆等简单的几何对象代表现实世界中的实体。在涉及这些几何对象的问题中,常需要了解其邻域中其他几何对象的信息。例如,在空中交通控制问题中,若将飞机作为空间中移动的一个点来看待,则具有最大碰撞危险的2架飞机,就是这个空间中最接近的一对点。这类问题是计算几何学中研究的基本问题之一。 问题描述:给定平面上n个点,找其中的一对点,使得在n个点的所有点对中,该点转载 2016-10-22 19:21:29 · 2786 阅读 · 1 评论 -
根据前序遍历和中序遍历结果重建二叉树(递归方法)
假设已经有了前序遍历和中序遍历的结果,如何重建这棵树呢?给定函数定义如下:void Rebuild(char* pPreOrder, //前序遍历结果 char* pInOrder, //中序遍历结果 int nTreeLen, //树的长度 NODE** pRoot) //返回NODE**类型原创 2016-10-24 22:08:58 · 1594 阅读 · 1 评论 -
贪心算法,递归算法,动态规划算法比较与总结
一般实际生活中我们遇到的算法分为四类: 一>判定性问题 二>最优化问题 三>构造性问题 四>计算性问题而今天所要总结的算法就是着重解决 最优化问题 《算法之道》对三种算法进行了归纳总结,如下表所示: 标准分治动态规划贪心算法原创 2016-08-05 15:09:12 · 678 阅读 · 0 评论 -
Permutations 全排列生成算法
1、使用递归生成算法/* * 递归输出序列的全排列 */void permutation(char* array, size_t array_size, unsigned int index){ if(index >= array_size) { for(unsigned int i = 0; i < array_size; ++i) { cout << array[原创 2016-08-04 19:10:36 · 949 阅读 · 0 评论 -
三种线性排序算法 计数排序、桶排序与基数排序
[非基于比较的排序]在计算机科学中,排序是一门基础的算法技术,许多算法都要以此作为基础,不同的排序算法有着不同的时间开销和空间开销。排序算法有非常多种,如我们最常用的快速排序和堆排序等算法,这些算法需要对序列中的数据进行比较,因为被称为基于比较的排序。基于比较的排序算法是不能突破O(NlogN)的。简单证明如下:N个数有N!个可能的排列情况,也就是说基于比较的排序算法的判定转载 2016-07-31 22:37:02 · 329 阅读 · 0 评论 -
剑指offer-最小的K个数
最小的K个数 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。输入 int[] input:待搜索的数组 ; int k:需要找出最小的数量输出 当k大于input长度时,返回空(非null);当k小于input长度时,返回input中最小的k个数字思路最粗暴方式,对数组所有元素排序(快排)利用冒泡排序原创 2016-06-27 21:45:39 · 553 阅读 · 0 评论 -
剑指offer-整数中1出现的次数(从1到n整数中1出现的次数)
整数中1出现的次数(从1到n整数中1出现的次数) 求出1 ~ 13的整数中1出现的次数,并算出100 ~ 1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。解决思路 常规思路(暴力解决),一个数一个数的计数寻找原创 2016-06-28 22:34:28 · 14113 阅读 · 2 评论 -
剑指offer-丑数
丑数 把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。思路挺简单的,直接看代码:package com.genge.offer;/** * Created by Genge on 2016-06-30. */public class GetUglyNumbe原创 2016-06-30 11:38:08 · 448 阅读 · 0 评论 -
剑指offer-数组中的逆序对
数组中的逆序对题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。例如: 例如,有一个数组为Array[0..n] 其中有元素a[i],a[j].如果 当i< j时,a[i]>a[j],那么我们就称(a[i],a[j])为一个逆序对。在数组{7,5,6,4}中一共存在5对逆序对,分别是(7,6),(7,5),原创 2016-06-30 16:44:37 · 958 阅读 · 0 评论 -
HashMap方法hash()、tableSizeFor()
HashMap#hash() /** * Computes key.hashCode() and spreads (XORs) higher bits of hash * to lower. Because the table uses power-of-two masking, sets of * hashes that vary only in bit原创 2016-07-01 16:21:44 · 4907 阅读 · 5 评论 -
如何判断链表中是否有环
今天面试被问住了,很惭愧啊,回来上网查了一下思路。自己写了点程序。1.如何判断是否有环?如果有两个头结点指针,一个走的快,一个走的慢,那么若干步以后,快的指针总会超过慢的指针一圈。2.如何计算环的长度?第一次相遇(超一圈)时开始计数,第二次相遇时停止计数。3.如何判断环的入口点:碰撞点p到连接点的距离=头指针到连接点的距离,因此,分别从碰撞点、头指针开始走,相遇转载 2016-07-02 11:09:53 · 242 阅读 · 0 评论 -
剑指offer-两个链表的第一个公共结点
两个链表的第一个公共结点 输入两个链表,找出它们的第一个公共结点。分析关键点: 这是一道微软的面试题。微软非常喜欢与链表相关的题目,因此在微软的面试题中,链表出现的概率非常高。如果两个单向链表有公共的节点,也就是说两个链表从某一个节点开始,它们的m_pNext都指向同一个节点。但由于是单向链表的节点,每个节点只有一个m_pNext,因此从第一个公共节点开始,之后它们所有的节点都是重合的,不原创 2016-07-02 11:33:21 · 530 阅读 · 0 评论 -
剑指offer-数字在排序数组中出现的次数
数字在排序数组中出现的次数 统计一个数字在排序数组中出现的次数。很明显,对于语序有序数组而言,二分查找再适合不过了 普通的二分查找 二分查找到元素对应的索引,然后向前、向后遍历查找计数 package com.genge.offer;/** * Created by Genge on 2016-07-02. * 统计一个数字在排序数组中出现的次数。 */public cl原创 2016-07-02 12:10:06 · 275 阅读 · 0 评论 -
剑指offer-数组中只出现一次的数字
数组中只出现一次的数字 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。分析:相信大家对数组中只有一个数字对出现一次,其他都出现2次的题目(算法)都清楚,嗯,对,就是异或。/*** 数组a中只有一个数出现一次,其他数都出现了2次,找出这个数字* @param a* @return*/public static int find1From原创 2016-07-02 17:51:50 · 348 阅读 · 0 评论 -
剑指offer-正则表达式匹配
正则表达式匹配题目描述 请实现一个函数用来匹配包括’.’和’‘的正则表达式。模式中的字符’.’表示任意一个字符,而’‘表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a”和”ab*ac*a”匹配,但是与”aa.a”和”ab*a”均不匹配,特别的注意,a* 、a*b* 等模式是可以匹配0一个字符串的问题分析下面是匹原创 2016-07-07 16:40:04 · 441 阅读 · 0 评论 -
剑指offer-矩阵中的路径
剑指offer-矩阵中的路径问题描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串”bcced”的路径,但是矩阵中不包含”abcb”路径原创 2016-07-09 16:15:14 · 2336 阅读 · 0 评论 -
剑指offer-机器人的运动范围
剑指offer-机器人的运动范围分享此题的目的是目前对回溯类型算法不太熟悉,这里做个记录,题目并不难 地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格35,38),因为3+5+3+原创 2016-07-09 17:26:40 · 611 阅读 · 0 评论 -
Sunday算法详解
一:背景Sunday算法是Daniel M.Sunday于1990年提出的字符串模式匹配。其效率在匹配随机的字符串时比其他匹配算法还要更快。Sunday算法的实现可比KMP,BM的实现容易太多。二:分析假设我们有如下字符串:A = "LESSONS TEARNED IN SOFTWARE TE";B = "SOFTWARE";Sund转载 2016-08-15 20:39:45 · 1015 阅读 · 0 评论 -
字符串匹配的Boyer-Moore算法
介绍了KMP算法。但是,它并不是效率最高的算法,实际采用并不多。各种文本编辑器的"查找"功能(Ctrl+F),大多采用Boyer-Moore算法。Boyer-Moore算法不仅效率高,而且构思巧妙,容易理解。1977年,德克萨斯大学的Robert S. Boyer教授和J Strother Moore教授发明了这种算法。下面,我根据Moore教授自己的例子来解释这种转载 2016-08-15 21:13:20 · 341 阅读 · 0 评论 -
判断线段相交
在讲解之前,先认识下“向量叉积”的概念:如图,对于给定的向量AB与向量AC,我们如何判断AB是在AC顺时针方向还是逆时针方向呢?(如图所示,AB在AC逆时针方向,同时,AC在AB的顺时针方向)假设向量AB坐标为(x1,y1),向量AC坐标为(x2,y2),则规定“向量叉积”为:x1 * y2 - y1 * x2 “向量叉积”的意义是:转载 2016-08-15 21:24:39 · 713 阅读 · 0 评论 -
凸包问题
首先介绍下什么是凸包问题?如下图:在一个二维坐标系,有若干点杂乱排列着,将最外层的点连接起来构成的凸多边型,它能包含给定的所有的点,这个多边形就是凸包。寻找凸包的算法有很多种,Graham Scan算法是一种十分简单高效的二维凸包算法,能够在O(nlogn)的时间内找到凸包。在讲解之前,读者需要了解向量叉积正负的几何意义,如不了解,可以参考htt转载 2016-08-15 21:49:10 · 3202 阅读 · 0 评论 -
扔鸡蛋问题详解(Egg Dropping Puzzle)
经典的动态规划问题,题设是这样的:如果你有2颗鸡蛋,和一栋36层高的楼,现在你想知道在哪一层楼之下,鸡蛋不会被摔碎,应该如何用最少的测试次数对于任何答案楼层都能够使问题得到解决。如果你从某一层楼扔下鸡蛋,它没有碎,则这个鸡蛋你可以继续用如果这个鸡蛋摔碎了,则你可以用来测试的鸡蛋减少一个所有鸡蛋的质量相同(都会在同一楼层以上摔碎)对于一个鸡蛋,如果其在楼层i扔下的时候摔碎了,对于任何原创 2016-10-04 17:55:46 · 1506 阅读 · 0 评论