算法
文章平均质量分 66
小白的学习笔记
这个作者很懒,什么都没留下…
展开
-
编程之美,实现MaxQueue
要求能在O(1)时间内取最大元素,并且放元素和取元素的时间复杂度尽量是O(1),之前有两个题是这个题的基础:1、实现MaxStack(或者MinStack)。实现MaxStack比较简单,因为栈的操作都是在一端进行的。2、用栈来实现队列。这个题就是上述两个题的综合应用。首先要实现一个MaxStack,然后再用两个MaxStack来实现一个队列,两个MaxStack中的最大值就是队列中的原创 2016-08-19 09:27:53 · 994 阅读 · 0 评论 -
leetCode:LRU Cache TreeMap应用
原题如下: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 th原创 2015-10-04 13:22:08 · 1253 阅读 · 0 评论 -
将矩阵顺时针旋转90度 leetCode:Rotate Image
一个图像用矩阵表示,将这个图像顺时针旋转90度,也就是将矩阵顺时针旋转90度。算法要求不使用额外的空间复杂度,in-place算法。观察了一下矩阵的转置,发现可以通过以此交换矩阵两行,然后再求转置的方式获得。思路如下:1、设矩阵有n行,则分别将i=0.1....(n/2-1)行与n-1-i行交换。(看上去有点像上半区与下半区交换)2、求转置,旋转完成。代码如下:package原创 2015-10-03 12:33:35 · 2374 阅读 · 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 · 768 阅读 · 0 评论 -
leetcode:Number of Islands
原题为:Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may原创 2015-10-03 13:41:32 · 331 阅读 · 0 评论 -
dfs递归过程代码优化
在一个图或者矩阵中,一个点往往有很多邻接点,在dfs搜索的过程中,如果有一个邻接点搜索成功,剩下的邻接定点就不需要搜索了。对矩阵中的DFS来说,还需要处理边界问题,保持搜素的点在矩阵内部,不会出现访问越界的情况,对此优化有两点:1、在搜索多个邻接定点时,使用“||或”运算,有个搜索成功即返回成功。2、将边界检查放在DFS函数的头部,如果越界,返回搜索失败,不需要进行递归。以leet原创 2015-10-05 12:12:58 · 1089 阅读 · 0 评论 -
算法中可以使用不等式变换避免溢出,leetcode:Sqrt(x) ,BigInteger处理溢出
在做leetcode题目Sqrt的时候,使用分治法时,要比较mid的平方与x的大小关系,如果mid的平方比mid大,那么right=mid-1,如果小,left=mid+1,在这种方式下,需要求mid的平方,mid的平方可能会超出Integer的范围,这就出现了溢出的问题,仔细想一下,需要求平方吗?完全可以避免。比较Math.pow(mid,2)与x的大小,完全可以用mid与x/mid的比较代原创 2015-10-03 16:09:24 · 1193 阅读 · 0 评论 -
二叉树,区分子节点和父节点的层序遍历
在普通的层序遍历中需要一个数据结构队列,在层序遍历时从队列头部取出节点,并将其子女追加到队列的末尾,这种遍历方式并不能体现出层次关系(当前层未遍历的节点与当前层已遍历的节点的子女在同一个队列中),有时候在进行层序遍历时需要明确层次,这个时候可以设置两个队列,一个父层队列,一个子女队列,父层队列遍历完之后,将子女队列设置为父层队列,并将子女队列清空。在leetcode中,有两个题可以用此方法轻松原创 2015-10-03 12:43:31 · 1434 阅读 · 0 评论 -
回溯法求集合的幂集
集合的幂集是由这个集合的元素组成的原集合的子集,例如集合{1,2,3}的幂集为: {},{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3}。 回溯法的思路是按照某种规则对解空间进行遍历,由回溯法来求集合的幂集非常简单,此问题的解即判断在某个子集中是否加入某个元素,例如解{1,3}将1,3加入,而2不加入,可以将问题的解空间定义为如下一颗状态树: 红色的直线表原创 2015-08-11 11:02:59 · 2942 阅读 · 0 评论 -
数组的全排列
数组的全排列这个题很早就了解过,但一直没有做,今天在leetcode上遇到了这个题,原题如下:Given a collection of numbers, return all possible permutations.For example,[1,2,3] have the following permutations:[1,2,3], [1,3,2], [2,1,原创 2015-08-25 16:51:10 · 1261 阅读 · 0 评论 -
判断一个数是不是素数 埃拉托斯特尼筛法 时间复杂度 O(n*lglgn)
说明:素数的定义:质数(prime number)又称素数。一个大于1的自然数,除了1和它本身外,不能被其他自然数整除,换句话说就是该数除了1和它本身以外不再有其他的因数;否则称为合数。最小的素数是2,最小的合数是4方法一:根据素数的定义,判断数n是不是素数,我们只需要从i=2开始,判断n能不能被n整除,一直到n-1,如果可以则说明不是素数。另一方面,一个数若是合数,则一定原创 2015-06-04 18:36:20 · 12332 阅读 · 9 评论 -
寻找数组中第k个最小值,使用快速排序
快速排序的一个特点是:每一次分区(partition)操作之后,就有一个元素被放在了数组的最终位置,在以后的排序过程中该元素位置不会变动;利用这个特点我们可以将快速排序稍加改造来寻找第k个最小值,假设在一次分区操作之后中枢(pivot)的位置在k之前,那么我们下次只需要在中枢的后面进行查找;如果中枢的位置在k之后,那么我们下次只需要在中枢之前进行查找,直到中枢等于k为止。我们知道快速排序的原创 2015-05-03 02:15:07 · 3360 阅读 · 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 · 416 阅读 · 0 评论 -
leetcode之 median of two sorted arrays
这是我做的第二个leetcode题目,一开始以为和第一个一样很简单,但是做的过程中才发现这个题目非常难,给人一种“刚上战场就踩上地雷挂掉了”的感觉。后来搜了一下leetcode的难度分布表(leetcode难度及面试频率)才发现,该问题是难度为5的问题,真是小看了它!网上搜了很多答案,但是鲜见简明正确的解答,唯有一种寻找第k小值的方法非常好,在此整理一下。 首先对leetco转载 2015-09-22 19:23:22 · 420 阅读 · 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 · 2263 阅读 · 0 评论 -
正则表达式匹配
剑指offer原题: 请实现一个函数用来匹配包括’.’和’*’的正则表达式。模式中的字符’.’表示任意一个字符,而’*’表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a”和”ab*ac*a”匹配,但是与”aa.a”和”ab*a”均不匹配 思路,回溯,关键是处理下一个字符是“*”的情况,如果下一个字符是“*”,且当前字原创 2016-05-14 20:42:51 · 723 阅读 · 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 · 603 阅读 · 0 评论 -
快速排序的非递归实现
这里讲了快速排序的递归实现插入排序 快速排序 分析整理,这里写一下非递归实现,非递归实现的要点是利用栈保存partition操作的子区间,即左边的坐标和右边的坐标。partition操作跟递归实现一样,不需要任何更改。代码如下:import java.util.Stack;//快速排序的非递归实现,利用栈保存一对下标public class QuickSortNonRecursion { p原创 2016-04-19 16:24:15 · 2286 阅读 · 0 评论 -
Trie树实现
用Java实现一个Trie树,trie,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。 更多关于Trie的介绍可以查看维基百科T原创 2016-05-03 10:38:59 · 745 阅读 · 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 · 1782 阅读 · 0 评论 -
leetcode:25. Reverse Nodes in k-Group
Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is原创 2016-05-01 21:00:30 · 402 阅读 · 0 评论 -
单核CPU画正弦曲线
编程之美第一个题目是控制CPU的比例,让单核CPU的利用率一直在50%,还有一个是画正弦曲线。 自己用java写了一个,如下:public class Solution { public void drawSin(){ int width = 200; //数组宽度,理解为正弦的步长 int height = 100; //正弦的最大高度原创 2016-04-17 22:11:08 · 893 阅读 · 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 · 8461 阅读 · 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 · 453 阅读 · 0 评论 -
一些算法问题(转载)
最近要开始准备面试找工作,算法是准备的重中之重,舍友推荐了《挑战程序设计竞赛》这本书。花了一周的时间大体过了一遍,该书真切地让我理解了“智商是硬伤”这句话的含义。我对它的评价是:如果智商小于120,只看前两章就够了;智商大于120小于150,三四章的简单章节还是可以看一下的;智商大于150,看完本书问题不大。望大家量力而为,否则你的自信心会遭受严重的打击。下面把自己看懂的,并感觉比较重要的转载 2015-09-22 19:01:30 · 1634 阅读 · 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 · 8693 阅读 · 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 · 9131 阅读 · 3 评论 -
对5个数进行排序,需7次比较的方法
本文介绍一个对5个数进行排序的方法,仅使用7次比较。假设要排序的数为a,b,c,d,e。 首先将a,b进行比较,假设结果为a比较,假设结果为c比较(即比较b,d),假设结果为b三次比较。,这个图的含义为:a 现在将e插入到{a,b,d}的适当位置,采用二分查找法寻找查找位置时,只需要两次比较——先同b比较,然后再同a或d比较。将e插入到{a,b,d}时,原创 2015-04-15 15:11:20 · 14283 阅读 · 0 评论 -
C语言大数相加
当要执行相加的两个数超出C语言所能表示的范围时,就不能用正常的加法运算来执行相加操作,这时候可以用两个字符数组接收要相加的两个大数,然后从两个大数的地位进行按位相加,并设置一个进位标志,如果标志为1,表示有进位,否则没有进位。要注意的是字符数组的地位为数字的高位,所以要从数组下标大的地方开始相加。#include #include int main(){ //a,b数组原创 2015-02-01 16:46:45 · 1898 阅读 · 1 评论 -
C语言大数相乘
C语言大数相乘最简单的就是模拟笔算乘法。首先用两个字符数组接收两个要进行乘法运算的大数,设置为a[ ],b[ ],并用一个整型数组c[ ]保存结果,在进行运算时,a数组第i个位置的数据与b数据第j个位置的数据相乘的结果存在c数据的第i+j个位置。另外两个数相乘,结果的长度不会超过这两个数长度的和。第一步也是按位执行乘法,将位乘法的结果累积到结果数据第二步是进位处理,确保每一位都是个位数原创 2015-02-04 00:34:51 · 1850 阅读 · 0 评论 -
C语言大数相减
C语言大数相减操作跟大数相加操作类似,也是按位相减,并保留一个借位标志carry,如果carry为1表示有借位,在执行相减操作之前,先判断被减数和减数的大小,总是用大数减去小数,如果减数大于被减数,则用减数减去被减数,然后再加上负号“-”,这样比较简单。下面程序有两个函数,第一用于判断两个数的大小,另一个是用大数减去小数。如果问题请提出来,相互学习。#include #include i原创 2015-02-01 22:12:31 · 3489 阅读 · 0 评论 -
c语言中getchar函数的用法,涉及EOF文件结束符的问题
最近因为遇到了这个EOF的问题就查了下,一下的这些内容帮助我解决了困惑已久的问题,写在这个希望能够帮助遇到同样问题的朋友! 在C语言中有个重要的库函数getchar(),可从终端获得一个字符的ASCII码值。在终端输入字符时并非输入一个字符就会返回,而是在遇到回车换行前,所有输入的字符都会缓冲在键盘缓冲器中,直到回车换行一次性将所有字符按序依次赋给相应的变量,在这里一定要注意转载 2014-12-07 11:16:03 · 2808 阅读 · 0 评论 -
C++ double最大值,设置小数点位数
C++在中定义了浮点类型的范围#define DBL_MAX 1.7976931348623158e+308 /* max value */#define DBL_MIN 2.2250738585072014e-308 /* min positive value */原创 2014-09-17 14:49:39 · 19876 阅读 · 0 评论 -
c格式化输出
一、printf()函数printf()函数是格式化输出函数,一般用于向标准输出设备按规定格式输出信息。在编写程序时经常会用到此函数。printf()函数的调用格式为: printf("", );其中格式化字符串包括两部分内容:一部分是正常字符, 这些字符将按原样输出, 另一部分是格式化规定字符,以"%"开始,后跟一个或几个规定字符用来确定输出内容格式。 参量表是需要输出的转载 2014-09-02 15:22:33 · 568 阅读 · 0 评论 -
我的算法学习之路
关于严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口——况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以我认为本文题目是合理的。如果你使用的是手机或平板设备,那么请点击下面的链接以获得更好的阅读效果:http://zh.lucida.me/blog/on-learning-algorithms/原文作者:Lu转载 2014-08-16 16:46:01 · 671 阅读 · 0 评论 -
使用vector 和 algorithm排序和去重
#include #include #include using namespace std;int main() { int ia[] = {5, 3, 1, 3, 2, 5}; vector ivec(ia, ia + sizeof(ia) / sizeof(int)); // sort unique erase sort(ivec.begin(), i转载 2014-08-28 10:48:20 · 2093 阅读 · 0 评论 -
字符串的全排列和组合算法
原文地址:http://blog.csdn.net/hackbuteer1/article/details/7462447转载 2014-08-05 15:33:41 · 595 阅读 · 0 评论 -
Ansi C 函数库
Ansi C 函数库 absread()读磁盘绝对扇区函数原形:int absread(int drive,int num,int sectnum,void *buf)功能:从drive指定的驱动器磁盘上,sectnum指定的逻辑扇区号开始读取(通过DOS中断0x25读取)num个(最多64K个)扇区的内容,储存于buf所指的缓冲区中。参数:driv转载 2014-08-24 15:08:14 · 913 阅读 · 0 评论 -
itoa函数
#include#includeint main(){ int num = 10; char str[100]; itoa(num, str, 2); printf("%s\n", str); return 0;}itoa()函数有3个参数:第一个参数是要转换的数字,第二个参数是目标字符串,第三个参数是转移数字时所用 的基数。在上例中,转换基数为10。10:十进制转载 2014-08-24 15:06:14 · 1762 阅读 · 0 评论 -
C语言大数阶乘
C语言大数阶乘的思路:1、设置一个整型数组表示最终的结果,整型数组的每一个元素表示结果的每一位,因此,每一个元素不超过9。2、初始化整型数组为1,有效长度为1,将k=1,2,3, ..., n乘到数组中,乘的时候将k与数组的每一个有效元素相乘,如果结果大于9,要处理进位。3、如果乘完之后进位carry仍然不为0,说明最高位有进位,有效长度要增加。代码如下:#include原创 2015-02-19 20:16:10 · 1894 阅读 · 0 评论