
算法设计与分析
文章平均质量分 66
小白的学习笔记
这个作者很懒,什么都没留下…
展开
-
求两个字符串的最大连续公共字串
如下两个字符串,公共连续字符串为abcdf,求出这个abcdf,"aaffffsfabcdfasf", "aaaadfsabcdfsdb"假设字符串长度分别为m,n,这个题有个m*n*min(m,n)复杂度的方法,这个方法比较慢,暂时不考虑。另一个种方法是动态规划:设置二维数组dp[][], dp[i][j]==0表示第一个字符串的第i个字符与第二个字符串的第j个字符不原创 2016-09-14 14:48:48 · 5228 阅读 · 1 评论 -
二叉树中和为某一值的路径
题目描述输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。 这道题思路不难,采用先序递归遍历的方式,先访问根节点,然后再访问子节点,在访问到叶节点时,检查当前累加和的大小,如果等于目标值,则将当前路径保存到结果中。这里发这篇博客的目的算是对上述过程的一个优化,我们用一个ArrayList<Integer>来保存原创 2016-04-27 21:54:30 · 593 阅读 · 0 评论 -
根据入栈顺序判断出栈顺序是否合法
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。 思路:先将入栈序列放入队列queue中。为入栈序列维护栈结构stack。对出栈序列进行如下操作:如果栈顶是出栈元素,出栈。 如原创 2016-04-25 23:42:59 · 2415 阅读 · 0 评论 -
顺时针打印矩阵
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 这个题有两种方法,剑指offer里使用的是第一种方法,即每次打印一圈,第i圈从位置(i,i)开始打印,但是这种方法只适用于方阵,或者原创 2016-04-25 23:01:01 · 358 阅读 · 0 评论 -
将二叉搜索树转换为双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。好悲伤,面试微软的时候被遇到这个题,知道大体思路,但是最终代码没写好,由此可见平常学东西不扎实。总是浅尝辄止。思路:使用中序遍历,保存已经建好的双向链表的最后一个节点。那么处理当前节点的时候就很简单了,即把最后一个节点的右指针指向当前节点,当前节点的左指针指向最后一个节点。代码如原创 2016-04-25 19:52:09 · 556 阅读 · 0 评论 -
LeetCode:306. Additive Number
原题: Additive number is a string whose digits can form additive sequence. A valid additive sequence should contain at least three numbers. Except for the first two numbers, each subsequent number in t原创 2016-02-23 16:53:20 · 2416 阅读 · 0 评论 -
LeetCode: 318. Maximum Product of Word Lengths
原题: Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the two words do not share common letters. You may assume that each word will contain only lower case原创 2016-02-23 14:28:41 · 510 阅读 · 0 评论 -
用PriorityQueue解决选择最小的K个数问题
Java 中的PriorityQueue是一个基于优先级堆的无界优先级队列。优先级队列的元素按照其自然顺序进行排序,或者根据构造队列时提供的 Comparator 进行排序,具体取决于所使用的构造方法。优先级队列不允许使用 null 元素。依靠自然顺序的优先级队列还不允许插入不可比较的对象(这样做可能导致 ClassCastException)。此队列的头是按指定排序方式确定的最小元素。如果多原创 2016-03-19 15:26:28 · 5397 阅读 · 0 评论 -
如何快速判断一个数是不是2的幂、3的幂、4的幂
1、判断是不是2的幂将2的幂写成二进制很容易看出,2的幂的二进制只有一个1,其余全是0,如下所示:000010000...00而将2的幂的二进制减1,其二进制变为:000001111...11所以判断一个数是不是2的幂的方法为使用按位与操作,如果结果为0,则是2的幂:n & (n-1)2、判断是不是4的幂4的幂首先是2的幂,因为4^n = (2^2)^n,所原创 2016-01-12 22:52:26 · 8583 阅读 · 1 评论 -
leetCode:Maximum Gap
原题:Given an unsorted array, find the maximum difference between the successive elements in its sorted form.Try to solve it in linear time/space.Return 0 if the array contains less than 2 ele原创 2015-12-05 21:28:39 · 478 阅读 · 0 评论 -
算法总结系列之五: 基数排序(Radix Sort)
基数排序是非比较排序算法,算法的时间复杂度是O(n). 相比于快速排序的O(nlgn),从表面上看具有不小的优势.但事实上可能有些出入,因为基数排序的n可能具有比较大的系数K.因此在具体的应用中,应首先对这个排序函数的效率进行评估.基数排序的主要思路是,将所有待比较数值(注意,必须是正整数)统一为同样的数位长度,数位较短的数前面补零. 然后, 从最低位开始, 依次进行一次稳定排序(我们常用上一转载 2015-12-05 20:08:55 · 749 阅读 · 0 评论 -
回溯法 0 1背包问题
用回溯法解决0 1背包问题#include <stdio.h>#include <stdlib.h>/* 用回溯法解决01背包问题,维护的变量有: curState[]: 当前状态中物品是否被选中,若i选中,则curState[i]=1,否则为0. optState[]: 从搜索开始到目前状态中的最优状态。 curWeight: 当前的总重量 curVal原创 2015-06-25 18:00:42 · 737 阅读 · 0 评论 -
汉诺塔问题
详细问题描述可以参考维基百科:https://en.wikipedia.org/wiki/Tower_of_Hanoi汉诺塔问题:有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:每次只能移动一个圆盘;大盘不能叠在小盘上面。递归思路:move(A, C,n) 可以分解为一下几个子问题:1、原创 2015-12-17 16:25:52 · 1586 阅读 · 0 评论 -
一些算法问题(转载)
最近要开始准备面试找工作,算法是准备的重中之重,舍友推荐了《挑战程序设计竞赛》这本书。花了一周的时间大体过了一遍,该书真切地让我理解了“智商是硬伤”这句话的含义。我对它的评价是:如果智商小于120,只看前两章就够了;智商大于120小于150,三四章的简单章节还是可以看一下的;智商大于150,看完本书问题不大。望大家量力而为,否则你的自信心会遭受严重的打击。下面把自己看懂的,并感觉比较重要的转载 2015-09-22 19:01:30 · 1666 阅读 · 0 评论 -
leetcode之 median of two sorted arrays
这是我做的第二个leetcode题目,一开始以为和第一个一样很简单,但是做的过程中才发现这个题目非常难,给人一种“刚上战场就踩上地雷挂掉了”的感觉。后来搜了一下leetcode的难度分布表(leetcode难度及面试频率)才发现,该问题是难度为5的问题,真是小看了它!网上搜了很多答案,但是鲜见简明正确的解答,唯有一种寻找第k小值的方法非常好,在此整理一下。 首先对leetco转载 2015-09-22 19:23:22 · 443 阅读 · 0 评论 -
单核CPU画正弦曲线
编程之美第一个题目是控制CPU的比例,让单核CPU的利用率一直在50%,还有一个是画正弦曲线。 自己用java写了一个,如下:public class Solution { public void drawSin(){ int width = 200; //数组宽度,理解为正弦的步长 int height = 100; //正弦的最大高度原创 2016-04-17 22:11:08 · 926 阅读 · 0 评论 -
合并k个有序链表
leetcode题目:23. Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 如果每次遍历k个链表寻找最小值,那么时间复杂度为O(n*k),超时。用堆可以将时间复杂度降原创 2016-05-01 22:29:32 · 1805 阅读 · 0 评论 -
腾讯实习 取纽扣游戏
(2017腾讯实习生校招笔试题)Calvin和David正在玩取纽扣游戏,桌上一共有16个纽扣,两人轮流来取纽扣,每人每次可以选择取1个或3个或6个(不允许不取),谁取完最后的纽扣谁赢。Cavin和David都非常想赢得这个游戏,如果Cavin可以先取,Cavin的必胜策略下第一步应该取 A、1个 B、3个 C、6个 D、Cavin没有必胜策略这个原创 2016-09-02 11:33:30 · 1368 阅读 · 0 评论 -
判断一个二叉树是不是合法的二分查找树
leetcode题目https://leetcode.com/problems/validate-binary-search-tree/,判断一个二叉树是不是合法的二分查找树,这个题目应该说遇到多次了,然而在写的时候还是费了一番时间,而且写了一个十分拙劣的算法(在本文最后,不做解释)。参考leetcode的discuss,遇到了两个比较好的解法,一个是递归(同样是递归,人家的就很简单),另一个原创 2016-08-23 10:57:59 · 3652 阅读 · 0 评论 -
Top K Frequent Elements 选出数组中出现次数最多的k个元素
原题地址:https://leetcode.com/problems/top-k-frequent-elements/,这个题目要求时间复杂度不能超过O(nlgn),也就是说常规的排序算法不可行(排序算法复杂度至少为nlgn)。那么想到的一种算法是使用优先队列,限制优先队列的大小为K,那么可以做到时间复杂度为O(nlgk),还能不能再提高呢,另一种方法是使用桶排序,算法复杂度为O(n)。原创 2016-08-22 17:49:31 · 3645 阅读 · 0 评论 -
二分查找总结
在《编程之美》中有一组关于二分查找的题目,给定一个有序(不降序)数组arr和一个数字v:1、求任意一个i,使得arr[i]等于v,不存在则返回-1。2、求最小的一个i,使得arr[i]等于v,不存在则返回-1。3、求最大一个i,使得arr[i]等于v,不存在则返回-1。4、求最大的i,使得arr[i]小于v,不存在则返回-1。5、求最小的i,使得arr[i]大于v,不存在返回-原创 2016-08-19 19:38:02 · 448 阅读 · 0 评论 -
编程之美,实现MaxQueue
要求能在O(1)时间内取最大元素,并且放元素和取元素的时间复杂度尽量是O(1),之前有两个题是这个题的基础:1、实现MaxStack(或者MinStack)。实现MaxStack比较简单,因为栈的操作都是在一端进行的。2、用栈来实现队列。这个题就是上述两个题的综合应用。首先要实现一个MaxStack,然后再用两个MaxStack来实现一个队列,两个MaxStack中的最大值就是队列中的原创 2016-08-19 09:27:53 · 1029 阅读 · 0 评论 -
数组的最大连续子序列xor
最大子序列和的问题经常被问到,这个问题有很多解法,比如这里:最大子序列和整理,复杂度从O(n^3)到O(n)。 最大子序列异或的运算用到了异或运算的性质,以及Trie树。大体思路为,ai xor …xor aj = (a0 xor …xor ai-1) xor (a0 xor … xor aj)。 看代码的,懒得写了,不懂再交流。public class Solution { Bit原创 2016-06-29 16:57:42 · 2184 阅读 · 0 评论 -
二叉树的前中后非递归遍历
import java.util.ArrayList;import java.util.Stack;public class Solution { //前序非递归遍历,根 左 右 public ArrayList preOrderTraversal(TreeNode root){ ArrayList res = new ArrayList(); if(root==null){转载 2016-06-27 19:44:52 · 519 阅读 · 0 评论 -
插入排序 快速排序 分析整理
1、插入排序插入排序是将一个元素插入到已经排好序的子序列中,实现下,n表示数组的长度。在排第i元素时,先将第i个元素暂存(temp=a[i]),然后i-1个位置开始依次将比a[i]大的元素后移。最终将a[i]插入到正确位置。//插入排序void insert_sort(int *a,int n){ int temp,i,j; for(i=1;i<n;i++){ temp = a[原创 2015-03-22 10:54:39 · 2300 阅读 · 0 评论 -
149. 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. 在一个二维平面上有一个点,求这些点组成的直线中含有最多的点的点的个数。思路:这个题思路不难,第一步首先找出所有的直线,放到一个HashSet中,使用HashSet是为了去重。第二步遍历所有的原创 2016-05-04 11:05:37 · 716 阅读 · 0 评论 -
正则表达式匹配
剑指offer原题: 请实现一个函数用来匹配包括’.’和’*’的正则表达式。模式中的字符’.’表示任意一个字符,而’*’表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a”和”ab*ac*a”匹配,但是与”aa.a”和”ab*a”均不匹配 思路,回溯,关键是处理下一个字符是“*”的情况,如果下一个字符是“*”,且当前字原创 2016-05-14 20:42:51 · 757 阅读 · 0 评论 -
leetcode:Coin Change
原题:You are given coins of different denominations and a total amount of money amount. Write a function to compute the fewest number of coins that you need to make up that amount. If that amount of原创 2016-05-03 22:59:52 · 630 阅读 · 0 评论 -
快速排序的非递归实现
这里讲了快速排序的递归实现插入排序 快速排序 分析整理,这里写一下非递归实现,非递归实现的要点是利用栈保存partition操作的子区间,即左边的坐标和右边的坐标。partition操作跟递归实现一样,不需要任何更改。代码如下:import java.util.Stack;//快速排序的非递归实现,利用栈保存一对下标public class QuickSortNonRecursion { p原创 2016-04-19 16:24:15 · 2315 阅读 · 0 评论 -
Trie树实现
用Java实现一个Trie树,trie,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。 更多关于Trie的介绍可以查看维基百科T原创 2016-05-03 10:38:59 · 778 阅读 · 0 评论 -
343. Integer Break
原题:Given a positive integer n, break it into the sum of at least two positive integers and maximize the product of those integers. Return the maximum product you can get.For example, given n = 2,原创 2016-05-01 23:31:25 · 404 阅读 · 0 评论 -
leetcode Word Search II
原题如下:Given a 2D board and a list of words from the dictionary, find all words in the board.Each word must be constructed from letters of sequentially adjacent cell, where "adjacent" cells are原创 2015-10-23 16:14:03 · 381 阅读 · 0 评论 -
leetcode:Fraction to Recurring Decimal
原题如下: Given two integers representing the numerator and denominator of a fraction, return the fraction in string format.If the fractional part is repeating, enclose the repeating part in parentheses.F原创 2015-10-07 11:18:16 · 437 阅读 · 0 评论 -
[LeetCode(Q69)] Sqrt(x) (编程实现sqrt)
Q: Implement int sqrt(int x).Compute and return the square root of x.A:这里给出两种实现方法:一是二分搜索,二是牛顿迭代法。1. 二分搜索对于一个非负数n,它的平方根不会大于(n/2+1)(谢谢@linzhi-cs提醒)。在[0, n/2+1]这个范围内可以进行二分搜索,求出n的平方根。int sqr转载 2015-10-03 14:16:36 · 800 阅读 · 0 评论 -
判断一个数是不是素数 埃拉托斯特尼筛法 时间复杂度 O(n*lglgn)
说明:素数的定义:质数(prime number)又称素数。一个大于1的自然数,除了1和它本身外,不能被其他自然数整除,换句话说就是该数除了1和它本身以外不再有其他的因数;否则称为合数。最小的素数是2,最小的合数是4方法一:根据素数的定义,判断数n是不是素数,我们只需要从i=2开始,判断n能不能被n整除,一直到n-1,如果可以则说明不是素数。另一方面,一个数若是合数,则一定原创 2015-06-04 18:36:20 · 12408 阅读 · 9 评论 -
无向图 广度优先遍历 c语言实现
这里记录一下无向图的广度优先遍历,无向图用邻接表表示,使用的图的示例图如下,关于图的表示可以参照博客:无向图的表示:邻接矩阵和邻接表,这里不再赘述,无向图的表示的代码被封装到头文件queue.h 中。 另外还涉及到C语言的队列问题,可以参照博客:C 循环队列实现,同样不再赘述,循环队列实现的代码被封装到头文件graph_represent.h 中。程序使用示例图: 实现要点: 每个定点有三个状原创 2015-06-22 16:05:19 · 6406 阅读 · 0 评论 -
寻找数组中第k个最小值,使用快速排序
快速排序的一个特点是:每一次分区(partition)操作之后,就有一个元素被放在了数组的最终位置,在以后的排序过程中该元素位置不会变动;利用这个特点我们可以将快速排序稍加改造来寻找第k个最小值,假设在一次分区操作之后中枢(pivot)的位置在k之前,那么我们下次只需要在中枢的后面进行查找;如果中枢的位置在k之后,那么我们下次只需要在中枢之前进行查找,直到中枢等于k为止。我们知道快速排序的原创 2015-05-03 02:15:07 · 3409 阅读 · 0 评论 -
寻找5个数的中位数,只需6次比较的,思路与实现
问题:寻找5个数的中位数,5个数中可能有相同的数,假设数依次存放在a[0] a[1] a[2] a[3] a[4]中,为了简便记为a0,a1,a2,a3,a4思路:定义compare_swap(int* a,int* b)方法,此方法比较a,b两个数的大小,如果a大于b则交换两个数,也就是将两个数的较小者存放在a中,将较大者存放在b中。按照如下顺序进行比较:比较a0 a1,将较小者存入a0原创 2015-05-02 14:17:50 · 9097 阅读 · 0 评论 -
同时寻找最大值和第二大值 锦标赛算法
问题:在一个数组中同时寻找最大值和第二大值,这里假设数组的元素个数n大于2方法一:遍历数组,设置max和secondMax标志,如果有大于max的就更新max,如果有小于max但是大于secondMax的就更新secondMax。比较次数:在a[0]和a[1]中找出临时的max和secondMax需要一次比较。在剩下的n-2个数中最坏时需要同max和secondMax分别比较,总共比较2(原创 2015-05-02 12:31:54 · 9378 阅读 · 3 评论 -
堆排序分析及优化
堆排序,是利用堆结构进行排序,一般是利用最大堆,即根节点比左右两个子树的节点都大,具体算法步骤如下。一、创建堆 首先将数组中的元素调整成堆,对应下面程序中的createHeap(List list)方法。创建堆就是从树中最后一个内节点(下标为(n-1)/2)开始调整数组中元素的位置,使以这个内节点为根的子树满足堆的结构。即依次将以(n-1)/2、(n-1)/2-1、(n-1)原创 2015-04-09 15:21:03 · 2496 阅读 · 1 评论