一、滑动窗口最大值
方法1:暴力解法,整个数组遍历,然后每一次找k个元素窗口的最大值保存下来,但是会超时;
方法2:学习了解答区里面的方法,用数组保存数字的index,借鉴队列的思路用于排序,找到队列头的值,来存储最大值,每次遍历后,能保证队列头值是最大值。
int* maxSlidingWindow(int* nums, int numsSize, int k, int* returnSize)
{
if(numsSize < 0)
return NULL;
int* indexArr = (int*)malloc(sizeof(int)* numsSize);
int* result= (int*)malloc(sizeof(int)* (numsSize - k + 1));
int idx = 0;
int left = 0;
*returnSize = 0;
for(int i = 0; i < k; i++)
{
/****/
while(idx > left && nums[i] > nums[indexArr[idx -1]])
{
idx--;
}
indexArr[idx++] = i;
}
result[(*returnSize)++] = nums[indexArr[left]];//第一个最大值
for(int i = k; i < numsSize; i++)
{
/**找到i ~ i+k个最大数的index**/
while(idx > left && nums[i] > nums[indexArr[idx -1]])
{
idx--;
}
indexArr[idx++] = i;
/**保证 q[left], q[right]在区间边界 **/
while(indexArr[left] <= i - k)
{
left++;
}
result[(*returnSize)++] = nums[indexArr[left]];
}
return result;
}
二、前k个高频元素
c语言没有代码随想录解答方法里面的队列,需要自己实现,显得比较麻烦,因此看到一个使用hashmap保存key times的方式,然后根据times排序,获取前k个频次最高的数字。
验证过程中,以下几个方面出错:
1 定义一个hashtable作为hashmap的头,调用hash find,修改的是tmp hash的值。
2 hashtable应该放到函数内部,如果作为全局变量,调用find时候,容易导致find错误。
/**
HASH_FIND_INT(num_head, nums + i, temb);
HASH_SORT(num_head, compare);
HASH_ADD_INT(num_head, num, temb);
**/
typedef struct hash {
int num;
int time;
UT_hash_handle hh;
}HashTable;
int compare(void* a, void* b)
{
return ((HashTable*)b)->time - ((HashTable*)a)->time;
}
int* topKFrequent(int* nums, int numsSize, int k, int* returnSize)
{
int* result = (int*)malloc(sizeof(int) * k);
HashTable* hashtable = NULL;//放到外面,成全局变量 导致find函数出错
/**step1: 添加元素到hashtable**/
for(int i = 0; i < numsSize; i++)
{
HashTable* tmpHash = NULL;
HASH_FIND_INT(hashtable, nums + i, tmpHash);
// if(tmpHash)
// {
// // printf("qqq find\n");
// (tmphash->time)++;
// continue;
// }
// tmpHash = (HashTable*)malloc(sizeof(HashTable));
// tmpHash->num = nums[i];
// tmpHash->time = 1;
// // printf("[null] %d\n", tmpHash->num);
// HASH_ADD_INT(hashtable, num, tmpHash);
if(tmpHash == NULL)
{
tmpHash = (HashTable*)malloc(sizeof(HashTable));
tmpHash->num = nums[i];
tmpHash->time = 1;
printf("[null] %d\n", tmpHash->num);
HASH_ADD_INT(hashtable, num, tmpHash);
}
else
{
printf("[hash] %d\n", tmpHash->num);
// hashtable->num = nums[i];
(tmpHash->time)++;
}
}
/**step2: sort**/
HASH_SORT(hashtable, compare);
/**step3: find k max times**/
*returnSize = 0;
for(int i = 0; i < k; i++)
{
// printf("hash is %d\n", hashtable->num);
result[(*returnSize)++] = hashtable->num;
hashtable = hashtable->hh.next;
}
return result;
}