C算法-线性探测法

leetcode945题,使数组唯一的最小增量。
给出一个数组Arr[3,2,1,2,1,7],每次只能某个元素+1,使最后每个元素各不相同。
参考作者题解,有那么一点并查集的味道。
1、申请一个数组tmp,初始化为-1;
2、如果b=Arr[i],在tmp的下标中没有存,那么直接放进去,并且置为b+1。暗示下次如果还有这个元素想来这个坑,需要去b+1处找找位子。
3、如果已经存过loc = tmp[b]已经有数据了,那么去找loc是否有戏,如果没戏,就去找tmp[loc]给出的位置。另外,不要忘记对中间的这些tmp[loci]进行刷新

#define MAXLEN 50002
int minIncrementForUnique(int* A, int ASize) {
    
    
	int i, sum, loc, locstead, b, ltmp;
	int tmp[MAXLEN];
	for (i = 0; i < MAXLEN; i++) {
    
    
		tmp[i] = -1;
	}
	sum = 0;
	for (i = 0; i < ASize; i++) {
    
    
		b = A[i];
		if (tmp[b] == -1) {
    
    
			tmp[b] = b + 1;
			continue;
		}
		locstead = loc = tmp[b];//b给的提示
		if (tmp[loc] == -1) {
    
      //如果b给的提示是对的,直接占坑
			sum += loc - b;
			tmp[loc] = loc + 1;
			continue;
		}
		while (tmp[loc] != -1) {
    
     //如果b给的提示已经不对了,就往下找
			loc = tmp[loc];
		}
		while (tmp[locstead] != -1) {
    
     //刷新
			ltmp = tmp[locstead];
			tmp[locstead] = loc + 1;
			locstead = ltmp;
		}
	    tmp[loc] = loc + 1;
		sum += loc - b;
	}
	return sum;
}

猜你喜欢

转载自blog.csdn.net/weixin_45554139/article/details/105025159