力扣每日一题——350.两个数组的交集II

力扣每日一题——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

猜你喜欢

转载自blog.csdn.net/Seanfly9105/article/details/113248141