C算法-哈希

leetcode554题,砖墙。
leetcode347题,前 K 个高频元素。
leetcode1165题,单行键盘。

砖墙这道题,居然是把每一行的可能性加起来,然后查找全部出现最多的位置,真真秒啊!!!!!
单行键盘这道题,就是把字母作为索引,字母当前的位置作为值存下来,有人说算哈希,那就算把~ ~
其他,大同小异,就是求次数最多(554)或者前K多(347)的元素。
作者百度了下也并不懂哈希,归结出来就是快排+对信息的val和times进行存储就可以过。

554答案

int comp(const void *a, const void *b) {
    
    
	return *(int*)a - *(int*)b;
}

int leastBricks(int** wall, int wallSize, int* wallColSize) {
    
    
	int i, j, currcol, wallwide, arrSize, maxdata, maxCount, currdata, currCount, maxcol;
	arrSize = 0;
	maxcol = 0;
	for (i = 0; i < wallSize; i++) {
    
    
		if (wallColSize[i] > maxcol) maxcol = wallColSize[i];
	}

	int **tmp = (int**)malloc(sizeof(int *) * wallSize);
	int *tmpdata = (int *)malloc(sizeof(int) * wallSize * maxcol);
	int *arr = (int *)malloc(sizeof(int) * wallSize * maxcol);
	for (i = 0; i < wallSize; i++) {
    
    
		tmp[i] = &tmpdata[i * maxcol];
	}

	
	for (i = 0; i < wallSize; i++) {
    
    
		currcol = wallColSize[i];
		tmp[i][0] = wall[i][0];	
		arr[arrSize++] = tmp[i][0];
		for (j = 1; j < currcol; j++) {
    
    
			 tmp[i][j] = tmp[i][j-1] + wall[i][j];
			 arr[arrSize++] = tmp[i][j];
		}
	}

	wallwide = arr[arrSize - 1];
	qsort(arr, arrSize, sizeof(int), comp);
	maxdata = 0;
	maxCount = 0;
	currdata = arr[0];	
	currCount = 1;
	if (currCount > maxCount && currdata != wallwide) {
    
    
		maxCount = currCount;
		maxdata = currdata;
	}
	for (i = 1; i < arrSize; i++) {
    
    
		if (arr[i] == arr[i - 1]) {
    
    
			currCount++;
		} else {
    
    
			if (currCount > maxCount && currdata != wallwide) {
    
    
				maxCount = currCount;
				maxdata = currdata;
			}
			currdata = arr[i];
			currCount = 1;
		}
	}

	free(tmpdata);
	free(tmp);
	free(arr);
	return wallSize - maxCount;
}

1165答案

int calculateTime(char * keyboard, char * word) {
    
    
	if (word == NULL) {
    
    
		return 0;
	}
	int i, boardlen, wordlen, sum;
	boardlen = strlen(keyboard);
	int Queue[26];
	for (i = 0; i < boardlen; i++) {
    
    
		Queue[keyboard[i] - 'a'] = i;
	}
	int mm, nn, tmp;
	wordlen = strlen(word);
	sum = Queue[word[0] - 'a'];
	for (i = 1; i < wordlen; i++) {
    
    
		mm = Queue[word[i] - 'a'];
		nn = Queue[word[i - 1] - 'a'];
		tmp = mm > nn ? mm -nn : nn -mm;
		sum += tmp;
	}
	return sum;
}

347答案

#define MAXLEN 50000

typedef struct {
    
    
	int val;
	int times;
}Node;

int comp(const void *a, const void *b) {
    
    
	return *(int*)a - *(int*)b;
}
int comp1(const void *a, const void *b) {
    
    
	return ((Node*)b)->times - ((Node*)a)->times;
}

int* topKFrequent(int* nums, int numsSize, int k, int* returnSize) {
    
    
	Node tmp[MAXLEN] = {
    
    0};
	int diffsize, i;
	int *ret = (int*)malloc(sizeof(int) * k);
	*returnSize = k;

	qsort(nums, numsSize, sizeof(int), comp);

	diffsize = 0;
	tmp[diffsize].val = nums[0];
	tmp[diffsize].times = 1;

	for (i = 1; i < numsSize; i++) {
    
    
		if (nums[i] == nums[i - 1]) {
    
    
			tmp[diffsize].times++;
		} else {
    
    
			diffsize++;
			tmp[diffsize].val = nums[i];
			tmp[diffsize].times = 1;
		}

	}
	qsort(tmp,diffsize+1,sizeof(Node),comp1);
	for (i = 0; i < k; i++) {
    
    
		ret[i] = tmp[i].val;
	}
	return ret;
}

猜你喜欢

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