摘要: 1. 题目:给定一个数组求出和为0的所有三元组,要求去除重复的情况,如[-1,0,1]和[0,-1,1]是相同的情况。2. 分析:有一道经典题目是:给定一个有序数组,求出和为0的所有二元组。这道题目通过两个指针,一个从前向后走,一个从后向前走。最终的时间复杂度为O(n)。本题是这道题目的变形或者说引申。最原始的算法:三重for循环,找出所有情况,时间复杂度为O(n^3)。不过,根据上面那道题目可以得到一个时间复杂度为O(n^2)的算法。要求a+b+c=0,可以变成a+b=-c这种形式,外循环遍历一次数组,相当于固定c,内循环判断a+b是否等于-c。3. 代码:View Code 1 #inc. 阅读全文
posted @ 2012-08-10 15:58 kasuosuo 阅读(1588) 评论(0) 推荐(0) 编辑
摘要: 1. 题目:给定一个旋转的有序数组,比如{7,8,9,10,1,2,3}是{1,2,3,7,8,9,10}旋转之后得到的,在数组中查找是否存在元素key。要求时间复杂度为O(lgn)。假定数组中不存在重复元素。2. 分析:从上面的选择数组可以发现,array[middle]将数组分成两段,两段中必有一段是有序的。这样就可以使用二分查找了。一个变形的二分查找。3. 代码:View Code 1 #include <iostream> 2 #include <cassert> 3 4 using namespace std; 5 6 int rotateBinarySear 阅读全文
posted @ 2012-08-10 14:52 kasuosuo 阅读(1278) 评论(0) 推荐(0) 编辑
摘要: 1. 题目:使用putchar(不能使用sprintf,itoa等)输出一个long整型数。2. 分析:两种方法:(1)迭代输出 (2)递归输出3. 代码:View Code 1 //递归算法 2 void putlong(unsigned long n) 3 { 4 if (n < 10) 5 { 6 putchar(n+'0'); 7 return ; 8 } 9 putlong(n / 10); 10 putchar(n % 10 + '0'); 11 } 12 13 14 //迭代算法15 vo... 阅读全文
posted @ 2012-08-10 10:25 kasuosuo 阅读(446) 评论(0) 推荐(0) 编辑