1、最大间隙问题
给定n个实数,求着n个实数在实轴上向量2个数之间的最大差值,要求线性的时间算法。
方案1:最先想到的方法就是先对这n个数据进行排序,然后一遍扫描即可确定相邻的最大间隙。但该方法不能满足线性时间的要求。故采取如下方法:
- 找到n个数据中最大和最小数据max和min。
- 用n-2个点等分区间[min, max],即将[min, max]等分为n-1个区间(前闭后开区间),将这些区间看作桶,编号为
,且桶i 的上界和桶i+1的下届相同,即每个桶的大小相同。每个桶的大小为:
。实际上,这些桶的边界构成了一个等差数列(首项为min,公差为
),且认为将min放入第一个桶,将max放入第n-1个桶。
- 将n个数放入n-1个桶中:将每个元素x[i] 分配到某个桶(编号为index),其中
,并求出分到每个桶的最大最小数据。
- 最大间隙:除最大最小数据max和min以外的n-2个数据放入n-1个桶中,由抽屉原理可知至少有一个桶是空的,又因为每个桶的大小相同,所以最大间隙不会在同一桶中出现,然后扫面相邻桶的最大间距(如果有空桶,就计算空桶前后的两个桶的最大间距),顺序扫描一遍就可得到。
2、判断一个链表是否有环
struct Node {
int data;
int Node *next;
};
Node* testCylic(Node * h1) {
Node * p1 = h1, *p2 = h1;
while (p2!=NULL && 2->next!=NULL) {
p1 = p1->next;
p2= p2->next->next;
if (p1 == p2) {
return p1;
}
return null;
}
testCylic函数测试一个链表是否有环,如果有环返回除英语环中的某个节点的指针。没有环返回空。
3、测试两个链表是否相交
(1)首先判断两个链表是否有环。
如果没有环,直接判断两个链表的最后一个节点是否相等,相等则说明两个链表相交。不等就不想交
如果其中一个有环,另一个没有环,那么一定不想交。
如果两个都有环,那么首先用上面的测试环存在的函数,分别返回两个链表中处于环中的一个节点,然后在使用与判断链表是否有环的想法来判断是否相交。
bool isJoint(Node* p1,Node* p2)
{
Node* tmp1 = testCylic(p1);
Node* tmp2 = testCylic(p2);
if (null == tmp1 && null == tmp2))
{
return testSingle(p1,p2);
}
if (tmp1 != null && tmp2 != null)
{
Node* tmp = tmp1->next;
if (tmp == tmp1)
{
if (tmp1 == tmp2)
return true;
else
return false;
}
while (tmp != tmp1)
{
if(tmp2 == tmp1)
return true;
tmp = tmp->next->next;
tmp1 = tmp1->next;
}
return false;
}
else
return false;
}