我做这道题,是先用二分查找找到该数字,而后再遍历其前后相同的数字,统计次数。这种做法的平均时间复杂度为O(logn),最坏情况下为O(n),剑指offer上给的思路是两次用二分查找分别找到该数字第一次和最后一次出现的位置,这样的时间复杂度平均和最坏都是O(logn),稍好些》
下面贴上我按照自己思路写的代码:...
分类:
其他好文 时间:
2014-06-07 01:19:45
阅读次数:
197
归并排序完全遵循分治模式,主要操作分为三步:1.分解:分解待排序的n个元素序列为2个n/2个元素的子序列。2.解决:使用归并排序递归的排序两个子序列。3.合并:合并两个已排序的子序列。最重要的步骤就是合并2个已经排序的序列。例如:A和B都是从小到大排序的序列。依次对比A的第一个元素和B的第一个元素,...
分类:
其他好文 时间:
2014-05-31 01:27:11
阅读次数:
268
前面讨论了几种排序算法,三种O(n2)时间复杂度的排序算法:插入,选择和冒泡和两种O(nlgn)的算法:快速排序和归并排序。这几种排序数组除了归并排序需要额外的数组开销。其他几个的空间复杂度都是O(1)。通过比较交换元素完成排序.计数排序是利用空间换取时间,增加了两个额外数组的开销,而且计数排序有一...
分类:
其他好文 时间:
2014-05-30 03:29:19
阅读次数:
241
1、归并排序 2、内排序和外排序 外排序的一个例子是外归并排序(External merge
sort),它读入一些能放在内存内的数据量,在内存中排序后输出为一个顺串(即是内部数据有序的临时文件),处理完所有的数据后再进行归并。比如,要对 900 MB
的数据进行排序,但机器上只有 100 MB 的...
分类:
其他好文 时间:
2014-05-30 00:13:46
阅读次数:
257
#includeusing namespace std;////写出快速排序,归并排序与堆排序int
adjustarray(int a[],int left,int right){ int x = a[left]; while(left x
&& left < right) righ...
分类:
其他好文 时间:
2014-05-28 21:32:19
阅读次数:
282
快速排序也利用了分治的思想,跟归并排序排序相比减少了交换次数int partition(int
a[],int p,int r){ int x = a[r]; int i = p-1; int j; for(j = p;j<r;j++) {
if(a[j]...
分类:
其他好文 时间:
2014-05-26 02:47:46
阅读次数:
226
二分查找也是分治策略和递归一个重要的实例。对于一个有序的数组,二分查找的时间复杂度是O(logn)int binarysearch(int a[],int
s,int e,int k){ int mid =(s+e)/2; if(k==a[mid]) return mid;...
分类:
其他好文 时间:
2014-05-26 02:23:44
阅读次数:
170
Implementint sqrt(int x).Compute and return the
square root ofx.思路:二分查找法解决这道题class Solution {public: int sqrt(int x) { if(x1e-6)
{ ...
分类:
其他好文 时间:
2014-05-25 19:35:33
阅读次数:
225
//二分查找$arr = array(0,1,2,3,4,5,6,7,8,9); function
bin_sch($array, $low, $high, $k){ if ($low <= $high){ $mid =
intval(($low+$high)/2); ...
分类:
Web程序 时间:
2014-05-25 19:05:46
阅读次数:
338
最长递增子序列
问题:
求一个一维数组中最长递增子序列的长度。
解法1:
很明显用动态规划的算法,选取下面的阶段(这种选法极为常见),可使阶段间的关系具有无后效性。
阶段:在所有以元素k结尾的子数组中,选出其中的最长递增子序列,k=1,2...n。
状态:以元素k结尾的最长递增子序列中只有一个最长的递增子序列。
决策:决定元素k结尾的最长递增子...
分类:
其他好文 时间:
2014-05-25 04:37:56
阅读次数:
193