作者:小迅
链接:https://leetcode.cn/problems/two-out-of-three/solutions/2036973/ha-xi-mo-ni-zhu-shi-chao-ji-xiang-xi-by-lynvk/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
题目
思路
题意 -> 给定三个数组,将三个数组中出现次数大于等于 2 的元素重新组合并返回,顺序任意,其中出现次数计算为 某一个数组出现算 1 次出现次数,重复不累加。
所以在计算出现次数之前,需要对元素进行去重,对于去重我们可以使用哈希表,但是对于本题,由于数据量小,可以直接使用排序加判断进行简单去重,先对所有数组进行排序,然后判断是否重复出现,记录所有元素的出现次数,记录出现次数,可以使用数组哈希表,简单方便,最后枚举数组哈希表,将出现次数大于等于 2 的元素重组并返回
代码
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int cmp(const void *a, const void * b)
{
return *(int *) a - *(int *)b;
}
int* twoOutOfThree(int* nums1, int nums1Size, int* nums2, int nums2Size, int* nums3, int nums3Size, int* returnSize){
int *ans = (int *)malloc(sizeof(int) * 101);
memset(ans, 0, sizeof(int) * 101);
qsort(nums1, nums1Size, sizeof(int), cmp);
qsort(nums2, nums2Size, sizeof(int), cmp);
qsort(nums3, nums3Size, sizeof(int), cmp);//排序并初始化
++ans[nums1[0]];
for (int i = 1; i < nums1Size; ++i) {//枚举数组1
if (nums1[i] == nums1[i-1]) {//判断去重
continue;
}
++ans[nums1[i]];
}
++ans[nums2[0]];
for (int i = 1; i < nums2Size; ++i) {//枚举数组2
if (nums2[i] == nums2[i-1]) {
continue;
}
++ans[nums2[i]];
}
++ans[nums3[0]];
for (int i = 1; i < nums3Size; ++i) {//枚举数组3
if (nums3[i] == nums3[i-1]) {
continue;
}
++ans[nums3[i]];
}
*returnSize = 0;
for(int i = 0; i < 101; ++i) {//记录大于等于2 的元素
if (ans[i] >= 2) {
ans[(*returnSize)++] = i;
}
}
return ans;
}
作者:小迅
链接:https://leetcode.cn/problems/two-out-of-three/solutions/2036973/ha-xi-mo-ni-zhu-shi-chao-ji-xiang-xi-by-lynvk/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。