力扣每日一题——350.两个数组的交集II
题目描述
代码注释
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int* intersect(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){
//记录获得数组元素个数
int k=0;
/*根据Note: The returned array must be malloced, assume caller calls free().
开辟新数组*/
int *result = (int *)malloc(sizeof(int) * fmax(nums1Size,nums2Size));
/*在较长数组里找与较短数组中相等的数,找到一次就把这个数标记成-1,因为结果要
与两数组中出现次数最小的一致,但其实前提是测试用例的数组中同样没有-1这个数*/
if(nums1Size<nums2Size){
for(int i = 0;i<nums1Size;i++){
for(int j = 0;j<nums2Size;j++){
if(nums1[i]==nums2[j]){
result[k]=nums1[i];
nums2[j]=-1;
k++;
break;
}
}
}
}else{
for(int i = 0;i<nums2Size;i++){
for(int j = 0;j<nums1Size;j++){
if(nums2[i]==nums1[j]){
result[k]=nums2[i];
nums1[j]=-1;
k++;
break;
}
}
}
}
*returnSize=k;
return result;
}
反思心得
1.刚开始没加break,出现了如下的错误:
以较短数组为基准在较长数组中找一样的元素的话,应该在较长数组中找到一个并标记为-1后跳出第二个for循环的,不然就会出现这样元素重复的错误。
2.提交结果如下:
可见这是一种暴力解法,特别费时,题解中有提到哈希表和双指针解法,值得我再琢磨琢磨 orz,C语言基础一般&其他语言刚开始学的我又去找了其他C语言版本的代码,这篇文章里有用C语言写的哈希法,可以参考https://blog.csdn.net/sumisu666/article/details/107313790?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~aggregatepage~first_rank_v2~rank_aggregation-2-107313790.pc_agg_rank_aggregation&utm_term=%E4%B8%A4%E4%B8%AA%E6%95%B0%E7%BB%84%E7%9A%84%E4%BA%A4%E9%9B%86c%E8%AF%AD%E8%A8%80&spm=1000.2123.3001.4430