【每日刷题】Day76
🥕个人主页:开敲🍉
🔥所属专栏:每日刷题🍍
🌼文章目录🌼
1. 561. 数组拆分 - 力扣(LeetCode)
2. 删除有序链表中重复的元素-II_牛客题霸_牛客网 (nowcoder.com)
3. 645. 错误的集合 - 力扣(LeetCode)
1. 561. 数组拆分 - 力扣(LeetCode)
//思路:排序。我们仔细研究题目的要求不难发现,想要满足要求,只需要将这n对数据中的每一对数据差值的绝对值最小,然后加上每一对数据中的较小值即可。
//记数排序
void CountSort(int* arr,int size)
{
int max = -100000;
int min = 100000;
for(int i = 0;i<size;i++)
{
if(arr[i]>max)
max = arr[i];
if(arr[i]<min)
min = arr[i];
}
int* hash = (int*)calloc(max-min+1,sizeof(int));
for(int i = 0;i<size;i++)
{
hash[arr[i]-min]+=1;
}
int count = 0;
for(int i = 0;i<max-min+1;i++)
{
while(hash[i])
{
arr[count++] = i+min;
hash[i]--;
}
}
}
int arrayPairSum(int* nums, int numsSize)
{
int ans = 0;
CountSort(nums,numsSize);
for(int i = 0;i<numsSize;i+=2)
{
ans+=nums[i];
}
return ans;
}
2. 删除有序链表中重复的元素-II_牛客题霸_牛客网 (nowcoder.com)
//思路:哈希记数。遍历链表,将链表中所有元素的出现次数记录,随后遍历哈希数组,只将val为1的key放入链表中。
typedef struct ListNode LN;
struct ListNode* deleteDuplicates(struct ListNode* head )
{
if(!head)
return NULL;
LN* pmove = head;
int max = -100000000;
int min = 1001;
while(pmove)//求链表的最大最小值,以应对key为负数的情况
{
if(pmove->val>max)
max = pmove->val;
if(pmove->val<min)
min = pmove->val;
pmove = pmove->next;
}
int* hash = (int*)calloc(max-min+1,sizeof(int));
pmove = head;
while(pmove)
{
hash[pmove->val-min]+=1;//将pmove->val - min使负数变为正数(下标不能为负数)
pmove = pmove->next;
}
pmove = head;
for(int i = 0;i<max-min+1;i++)
{
if(hash[i]==1)//只保留出现一次的元素
{
pmove->val = i+min;
pmove = pmove->next;
}
}
if(pmove==head)
return NULL;
LN* pmove1 = head;
while(pmove1->next!=pmove)//在原链表的基础上改动,不额外创建链表。
{
pmove1 = pmove1->next;
}
pmove1->next = NULL;
return head;
}
3. 645. 错误的集合 - 力扣(LeetCode)
//思路:哈希记数。
int* findErrorNums(int* nums, int numsSize, int* returnSize)
{
int* ans = (int*)calloc(2,sizeof(int));
int* hash = (int*)calloc(numsSize+1,sizeof(int));
for(int i = 0;i<numsSize;i++)
{
hash[nums[i]]+=1;//记数
}
for(int i = 1;i<numsSize+1;i++)
{
if(hash[i]==2)//重复出现的元素
ans[0] = i;
if(!hash[i])//未出现的元素
ans[1] = i;
if(ans[0]&&ans[1])
break;
}
*returnSize = 2;
return ans;
}