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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值