随笔分类 -  Array

摘要:在不知道文件总行数的情况下,如何从文件中随机的抽取一行或是k行。已知random_m()随机数生成器的范围是[1, m] 求random_n()生成[1, n]范围的函数,m k时,要使得前n个数每个数被选中的概率都是k⁄n。 证明:假设n≥k,前n个数每个数被选中的概率都是k⁄n,则需要归纳证明前n+1个数每个数被选中的概率是k⁄(n+1)。 分两个角度去思考这个问题:一是第n+1个被选中的概率,很显然是k⁄(n+1)。二是第1、2、...、n个数被选中的概率也要是k⁄(n+1)。 后者分析:以第m个数为例(k 2 #include 3 #include 4 5 using na... 阅读全文

posted @ 2013-07-03 10:33 月moon鸟 阅读(431) 评论(0) 推荐(0)

摘要:一个二维数组,每一行从左到右递增, 每一列从上到下递增。判断数组中是否含有该整数。求二维子数组和的最大值(任意维度子矩阵,固定维度2×2子矩阵)。矩阵原地转置(n×n方阵,m×n矩阵)。1、思路:(详细参考:http://justjavac.iteye.com/blog/1310178) 剑指offer中提供的时间复杂度是O(m+n),如果考虑将线性二分查找的思想用在矩阵二分查找中,速度可能会有提升。 假设查找17,第一次比较10,然后比较25,然后比较13,返回元素13,这时候再递归查找13左下角的矩阵和右上角的矩阵就可以了(红色椭圆部分);如果是查找9,第一次 阅读全文

posted @ 2013-05-17 14:50 月moon鸟 阅读(194) 评论(0) 推荐(0)

摘要:请实现一个函数,把字符串中的每个空格替换成%20。(详见string)请实现时间复杂度为O(n)的计数排序。2、思路: 另外开辟一个数组空间,下标是原数组元素,下标指向的内容是原数组元素出现的次数。先记录原数组元素出现次数,再c[i]+=c[i-1],c[i]表示≤i的数出现的次数,然后从尾往前遍历原数组,这样可以保持稳定性。CountSort 1 //其中a为输入,b为输出,n为元素个数,k为最大元素 2 void count_sort_upgrade(int a[], int b[], int n, int k) 3 { 4 int j; 5 int *c = new ... 阅读全文

posted @ 2013-04-24 13:53 月moon鸟 阅读(161) 评论(0) 推荐(0)

摘要:快排的一种实现。(详见Sort)输入一个正数sum,打印出所有和为sum的连续正数序列(至少含有两个数)。输入两个字符串,从第一个字符串中删除第二个字符串中的所有字符。(详见String)1、思路: 将随机base放在尾部,设置small和big指针从头有先后的前进。每次big前进,判断是否小于base:如果小于base,那么small和big需要互换,然后small++;如若不然则跳过。Partition 1 int Partition(int* data, int length, int start, int end) 2 { 3 if (data == NULL || len... 阅读全文

posted @ 2013-04-18 17:32 月moon鸟 阅读(346) 评论(0) 推荐(0)

摘要:快排分割数组首尾的实现方式。输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。要求时间复杂度为O(n)。输入一个增序数组和一个数sum,在数组中找到两个数,使得和为sum。输入任意一对即可。1、思路: 先随机选base,与尾交换。然后从左往右遍历,找到比base大的数,交换;从右往左遍历,找到比base小的数,交换。QuickSort 1 #include <iostream> 2 #include <exception> 3 #include <stdlib.h> 4 #include <string 阅读全文

posted @ 2013-04-16 21:46 月moon鸟 阅读(249) 评论(0) 推荐(0)

导航