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