上一页 1 ··· 28 29 30 31 32 33 34 35 36 ··· 43 下一页
摘要: 一开始马上想起来寻找第k小的数,是采用快排的partition方法。但因为题目要把k之前的数排序输出,这个方法就不是很合适,因为(随机化后:http://blog.csdn.net/liangbopirates/article/details/9377105)它最差能在O(n)找到第k小的数,那么就要最差k*O(n)。如果对前面部分排序那就是O(k*logk) + O(n)了。都不合适,看来最合适的还是使用堆,能做到O(n*logK)。但partition方法和堆方法比较,有个好处就是inplace,不占多余内存,在海量数据处理的时候有这个好处。下面这段代码是寻找第k小的数,其精华部分是par 阅读全文
posted @ 2013-08-31 14:54 阿牧遥 阅读(290) 评论(0) 推荐(0)
摘要: 这道题就是典型的约瑟夫环问题。http://blog.csdn.net/wuzhekai1985/article/details/6628491一开始想了一下用数组来做,就是模拟方法,同时记录一下是不是一个节点已经删除。然后看了一下,也很自然的可以用链表来做。但这样的复杂度都是O(m*n)。如果不用模拟出其中的所有步骤,那么可以用数学方法来解,就是一个递推公式。f(n) = (f(n-1) + m) % n; f(1) = 1。推导过程参加链接。但精华部分是,当n个数字删掉一个数后,就成为了n-1个数,假设知道n-1个数的剩下的编号x,就可以映射回原来n个数里面。“胜利者的编号为 (x + k 阅读全文
posted @ 2013-08-31 00:44 阿牧遥 阅读(246) 评论(0) 推荐(0)
摘要: 很基础的一维动态规划,复杂度O(n)。public class Solution { public int maxSubArray(int[] A) { int len = A.length; if (len == 0) return 0; int[] max = new int[len]; max[0] = A[0]; int ans = max[0]; for (int i = 1; i ans) ans = max[i]; } return ans; }}但又要求... 阅读全文
posted @ 2013-08-30 00:31 阿牧遥 阅读(220) 评论(0) 推荐(0)
摘要: 有了上一道题目的基础,这道题目就简单多了。需要注意的是:1. 输入的s有可能只有一个字母,那么它和“CM”等比较时,有可能会先到末尾;2.本来想偷懒用subString()方法,但会超时,就用index来判断了。public class Solution { public int romanToInt(String s) { String ss[] = new String[] {"M", "CM", "D", "CD", "C", "XC", "L", 阅读全文
posted @ 2013-08-30 00:20 阿牧遥 阅读(160) 评论(0) 推荐(0)
摘要: 整数转罗马数字,这道题目对我们中国人来说是很郁闷的,因为不熟悉。但确实也有面试官考,所以复习一下。首先罗马数字的定义参见:http://baike.baidu.com/link?url=aDx5F_QUGwk0DIbgeLxvu0YX1RDUjETI67bdJSaNxDcWCdpZVK_DH_54IIq7Z-w-可以看到,其实就是1~9的循环表示,用不同的字符集。那么比较容易想到的就是下面这个方法。public class Solution { public String intToRoman(int num) { char[] roman = new char[] {'I... 阅读全文
posted @ 2013-08-29 23:49 阿牧遥 阅读(244) 评论(0) 推荐(0)
摘要: 一般而言,分配给进程的内存有四个概念上不同的区域,分别为:代码段、数据段、堆和栈,其中数据段又可以细分为初始化为非零的数据和初始化为零的数据。如下图所示:1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放 , 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域 阅读全文
posted @ 2013-08-28 23:26 阿牧遥 阅读(225) 评论(0) 推荐(0)
摘要: 这道题目如果不用常数级的空间是很容易的,就是用一个queue呗。public class Solution { public void connect(TreeLinkNode root) { LinkedList queue = new LinkedList(); queue.offer(root); int count = 0; int lastCount = 0; TreeLinkNode last = null; while (queue.size() != 0) { ... 阅读全文
posted @ 2013-08-28 22:29 阿牧遥 阅读(204) 评论(0) 推荐(0)
摘要: 这道题也不简单啊。这道题是在上一题基础上的扩展。可以做到O(n^2)的。首先上一题Largest Rectangle in Histogram有O(n)的解法。然后计算每一个位置从开始到目前有多少连续的1(假设按列算),这个可以通过O(n^2)做到,因为可以上一个加一,h[i][j-1]+1。接下来... 阅读全文
posted @ 2013-08-27 23:45 阿牧遥 阅读(274) 评论(0) 推荐(0)
摘要: 这是一道挺难得题目。传说中的单调栈。网上有个解说相当不错:http://www.cnblogs.com/lichen782/p/leetcode_Largest_Rectangle_in_Histogram.html第二刷感悟:这题如果不是O(n)的单调栈,其实可以用n*logn的方法做到。就是先找... 阅读全文
posted @ 2013-08-25 00:01 阿牧遥 阅读(344) 评论(0) 推荐(0)
摘要: http://ac.jobdu.com/problem.php?pid=1348数组中的逆序对也是个常见的题目,算法导论中也有一些描述,参考:http://www.cnblogs.com/wuyuegb2312/p/3156286.html。解法自然有朴素解法O(n^2)不表,然后有基于归并排序的,可以O(n*logn)。1.在归并排序中,同样是对一个数组分为两段处理,在处理这两段时,并不会影响右段元素与左段元素的逆序关系,只有在归并时才会改变。2.归并时的改变方式和插入排序是类似的:右段中取出元素放在左段其余所有元素前面时,相当于左段整体后移,后移的元素数就是这个逆序数。3.由于归并排序使用 阅读全文
posted @ 2013-08-23 00:45 阿牧遥 阅读(267) 评论(0) 推荐(0)
上一页 1 ··· 28 29 30 31 32 33 34 35 36 ··· 43 下一页