【每日刷题】Day67
🥕个人主页:开敲🍉
🔥所属专栏:每日刷题🍍
🌼文章目录🌼
1. 23. 合并 K 个升序链表 - 力扣(LeetCode)
2. 1189. “气球” 的最大数量 - 力扣(LeetCode)
3. 1207. 独一无二的出现次数 - 力扣(LeetCode)
1. 23. 合并 K 个升序链表 - 力扣(LeetCode)
//思路:记数排序。遍历K个链表,将每个元素出现的次数在以该元素为下标的位置记录于数组中。遍历数组,将所有下标不为0的下标元素链接为新链表。
typedef struct ListNode LN;
struct ListNode* mergeKLists(struct ListNode** lists, int listsSize)
{
if(!listsSize)
return NULL;
int count[20002] = {0};
for(int i = 0;i<listsSize;i++)
{
LN* tmp = lists[i];
while(tmp)
{
//将每个元素出现的次数在以该元素为下标的位置记录
count[tmp->val+10000]+=1;//由于链表元素取值为-10^4~10^4,因此这里需要将负数全部更正为正数。
tmp = tmp->next;
}
}
LN* newhead = (LN*)malloc(sizeof(LN));
newhead->next = NULL;
LN* ptail = newhead;
for(int i = 0;i<20001;i++)
{
while(count[i])//将所有元素链接为新链表
{
LN* node = (LN*)malloc(sizeof(LN));
node->val = i-10000;
node->next = NULL;
ptail->next = node;
ptail = ptail->next;
count[i]--;
}
}
if(!newhead->next)
return NULL;
return newhead->next;
}
2. 1189. “气球” 的最大数量 - 力扣(LeetCode)
//思路:哈希表。记录text中每个元素的个数,判断能组成多少个balloon。
int maxNumberOfBalloons(char* text)
{
int hash[27] = {0};
for(int i = 0;i<strlen(text);i++)
{
hash[text[i]-'a']+=1;//记数
}
int ans = 0;
char* s = "balloon";
int min = INT_MAX;//当'b'、'a'、'l'、'o'、'n'有一个单词用完后,就无法继续组成balloon,min用于判断是否有单词用完
while(min)
{
int i = 0;
for(i = 0;i<strlen(s);i++)
{
if(hash[s[i]-'a']<min)//找用完的单词
min = hash[s[i]-'a'];
if(hash[s[i]-'a']==0)//单词用完无法组成,直接跳出循环,保留当前i的值,用于判断是否组成了一个balloon
break;
hash[s[i]-'a']--;
}
if(i==strlen(s))//组成balloon后ans++
ans++;
}
return ans;
}
3. 1207. 独一无二的出现次数 - 力扣(LeetCode)
//思路:哈希表+排序+前后指针一次遍历。将数组中每个数的出现次数记录,并将其排序。排序后出现次数相同的一定是相邻的。前后指针遍历排序后的哈希表,找到相同的元素且不为0,return false;否则,出循环return true。
//记数排序
//采用记数排序是因为记数排序在面对数组中存在多个重复数据时速度更快
void CountSort(int* arr, int n)
{
int min = 0;
int max = 0;
for (int i = 0; i < n; i++)
{
if (arr[i] < arr[min])
min = i;
if (arr[i] > arr[max])
max = i;
}
int x = arr[min];
int y = arr[max];
int* tmp = (int*)calloc(y - x + 1, sizeof(int));
for (int i = 0; i < n; i++)
{
tmp[arr[i] - x] += 1;
}
int count = 0;
for (int i = 0; i < (y - x + 1); i++)
{
while (tmp[i])
{
arr[count++] = i + x;
tmp[i]--;
}
}
}
bool uniqueOccurrences(int* arr, int arrSize)
{
int hash[2002] = {0};
for(int i = 0;i<arrSize;i++)
{
hash[arr[i]+1000]+=1;//记录每个元素出现的次数
}
CountSort(hash,2002);//排序
for(int i = 0;i<2001;i++)
{
if(hash[i]==hash[i+1]&&hash[i])//遇到不是独一无二的return false。
return false;
}
return true;
}