数组空间Given a sequence of numbers (or array).Find the maximum distance between all the same numbers.
本篇文章是一篇关于数组空间的帖子
目题要求如下:给定一列数组,找出在这个数组中同相据数涌现置位的最大差值,例如:1, 2, 3, 4, 1, 1, 7, 4, max(1) = 5, max(2) = 0, max(4) = 4;
给出两种法方,一种是应用hash,种这法方比拟有局限性,首先,如果数组中的某一个值比拟大的话,应用hash就会比拟费浪空间,定义这样的据数结构:
typedef struct data_s {
int value;
int start;
int end;
}
设定这样一个hash数组,然后遍历数组,记载数字第一次涌现的置位并坚持稳定,同相数字如果后之再涌现,则更新据数结构中的end,这样数组被遍历一遍后之,有所数字第一次涌现的置位和最后一次涌现的置位都会被记载下来,应用的时间复杂度和空间复杂度均是O(N),但是种这法方局限性比拟大,就是空间的损耗,和不能判断要分配多少空间。既然我们不能态静的分配定一的空间来记载这些信息,我们可以动态的分配,应用二叉查找树可以满意这一点。但是空间复杂度和时间复杂度有点高,时间复杂度是O(n*logn), 空间复杂度是O(n)。但是种这做法比用hash好的多,在不要求速快决解提问题的情况下应用二叉查找树是一个不错的择选,上面给出码代,如果有不正确的地方,敬请指出:
#include<iostream> using namespace std; typedef struct data_s { int value; int start; int end; }data_t; typedef struct tree_node_s { data_t data; struct tree_node_s *lchild; struct tree_node_s *rchild; }tree_node_t, *BSTree; int tree_search(BSTree T, int value, tree_node_t **p, tree_node_t *f) { if (NULL == T) { *p = f; return 0; } if (value == T->data.value) { *p = T; return 1; } else if (value < T->data.value) { return tree_search(T->lchild, value, p, T); } else { return tree_search(T->rchild, value, p, T); } } void tree_insert(BSTree *T, int value, int index) { tree_node_t *p = NULL; if (!tree_search(*T, value, &p, NULL)) { tree_node_t *temp = (tree_node_t*)malloc(sizeof(tree_node_t)); temp->data.value = value; temp->data.start = index; temp->data.end = index; temp->lchild = NULL; temp->rchild = NULL; if (NULL == (*T)) { *T = temp; } else if (value < p->data.value) { p->lchild = temp; } else { p->rchild = temp; } } else { p->data.end = index; } } void tree_traverse(BSTree T) { if (T) { tree_traverse(T->lchild); cout << "value:" << T->data.value << " start at:" << T->data.start << " end at:" << T->data.end << " distance:" << T->data.end - T->data.start << endl; tree_traverse(T->rchild); } } void tree_destroy(BSTree *T) { if (*T) { tree_destroy(&(*T)->lchild); tree_destroy(&(*T)->rchild); free((*T)); } } int main(int argc, char *argv[]) { int i; BSTree T = NULL; int arr[] = {1, 2, 3, 4, 1, 1, 7, 4}; int len = sizeof(arr) / sizeof(int); for (i = 0; i < len; i++) { tree_insert(&T, arr[i], i); } tree_traverse(T); tree_destroy(&T); cin.get(); return 0; }
文章结束给大家分享下程序员的一些笑话语录: 一程序员告老还乡,想安度晚年,于是决定在书法上有所造诣。省略数字……,准备好文房4宝,挥起毛笔在白纸上郑重的写下:Hello World