2012年12月26日

摘要: 从一个数组中找出两个数字,让这两个数字之和等于一个给定值。解题思路:第一印象是循环查找,从第一个数开始,取所有其后面的数与其相加,并判断是否为给定值。此复杂度为O(n2).这种复杂度为O(n2)的解法,又是在一个无序的数组中,可以尝试先将其排序,再看排序后是否可以简化循环过程。下面是一个排序后的数组:1,4,5,6,7,8,9想要找相加和为N,则设置两个指针指向两端(p指向第一个,q指向最后一个),如果当前所指两个数相加大于N,则说明不可能还有在q所指元素之后与q所指元素相加会小于等于N,所以指针q向前移,如果两个数相加小于N,说明不可能还有数在指针p所指元素之前与当前所指元素相加会大于等于N 阅读全文
posted @ 2012-12-26 19:16 小龙人2012 阅读(275) 评论(0) 推荐(0)
摘要: 解题思路:一种是存储递归过程中已经计算过的值,另一种是通过递推关系式;这是第二种方法:F(n) = F(n-1) + F(n-2)F(n-1) = F(n-2) + F(n-3)...F(4) = F(3) + F(2)F(3) = F(2) + F(1)F(2) = F(1) + F(0)可以看出自底向上,每一次求解的两个值都包含在前一次的公式中,用代码写就相当于:int t;t = a;a = a + b;b = t;每次只需要用一个临时变量保存第一个值,然后将其做为下一次迭代的第二个值就可以了。int Fibonacci(int n){ if (n <= 0) ret... 阅读全文
posted @ 2012-12-26 17:01 小龙人2012 阅读(318) 评论(0) 推荐(0)
摘要: 想要得到N个数中最大的K个数,典型的思路就是设置一个数组arr[K],然后遍历N个数,判断当前数和数组arr[k]中最小的数,如果它大于数组中最小的数,则置换。在这个数组中寻找最小的数,如果无序的话,很明显复杂度即为O(K),如果排序的话,维护一个有序数列,并且每次都是取该序列最小值进行比较,就自然地想到了小根堆了。下面是使用c++的stl中的堆算法实现的代码,由于stl只支持四种算法:push_heapPush element into heap range(function template)pop_heapPop element from heap range(function temp 阅读全文
posted @ 2012-12-26 11:10 小龙人2012 阅读(223) 评论(0) 推荐(0)

导航