数组元素个数是1到1000,数组元素范围也是1到1000,冥冥中就是让用复合数组,第一个数组的值作为第二个数组的下标。
先遍历一边第一个数组,用一个标记数组记录各个值是否出现,初始值均为0,出现则变成1.
再遍历第二个数组,发现标记数组值为1的,表示之前出现过,那么就记录下元素值,并把标记值置0,那么下次再遇到这个下标的就不用比较了,因为标记为0了。
int* intersection(int* nums1, int nums1Len, int* nums2, int nums2Len, int* returnSize ) { int marked[1001] = {0}; //标记数组 int* res = (int*)malloc(sizeof(int) * 1001); //返回数组要用指针定义,之前就是这错了 int n = 0; for (int i = 0; i < nums1Len; ++i) { marked[nums1[i]] = 1; //第一便遍历,把nums中出现过的数在marked中标记为1 } for (int i = 0; i < nums2Len; ++i) { if (marked[nums2[i]] > 0) { res[n++] = nums2[i]; //记录公共元素值 marked[nums2[i]] = 0; //标记置0,同样的不用再比较 } } *returnSize = n; return res; }