算法题
10 Mar 2013
|
排序类
数组处理类
不使用额外空间删除已排序数组重复元素
给定排好序的数组A,大小为n,请给出一个O(n)的算法,删除重复元素,且不能使用额外空间。
/*
思路:index记录重排位置,从第二个开始遍历,若与index位置值不等,移到index+1,index++。
*/
#include <stdio.h>
void print(int a[], int n)
{
int i = 0;
for(; i < n; i++) {
printf("%d ", a[i]);
}
printf("\n");
}
int deldup(int a[], int n)
{
int i;
int index = 0;
for(i = 1; i < n; i++) {
if(a[i] == a[index]) {
continue;
} else {
a[index+1] = a[i];
index++;
}
}
return index+1;
}
int main()
{
int a[] = {1,1,2,2,2,3,3,3,3,5,5,7,7,7,9,9,9};
print(a, 17);
int n=deldup(a, 17);
print(a, n);
return 0;
}
字符串处理类
链表类
树
- Size Balanced Tree(SBT)
- 二叉查找树(BST) 查找最好时间复杂度O(logN),最坏时间复杂度O(N)。
- 平衡二叉查找树(AVL) 查找的时间复杂度维持在O(logN) ,严格平衡策略以牺牲建立查找结构(插入,删除操作)的代价。
- 红黑树(RBT) 查找 效率最好情况下时间复杂度为O(logN),但在最坏情况下比AVL要差一些,但也远远好于BST。
- Treap