user-0 提问: 求大佬解疑答惑

回复:
user: user-1
content: 最后记着释放  #include <stdio.h> #include <stdlib.h>  //#define MAXSIZE 1024  #define min(x, y) ((x) > (y) ? (y):(x)) int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) {      int min_size = min(nums1Size, nums2Size), *array;     int i, j, k;        array = (int *)malloc(sizeof(int) * min_size);     if (!array)         return NULL;      *returnSize = 0;     for (i = 0; i < nums1Size; i++) {         for (j = 0; j < nums2Size; j++) {             if (nums1[i] == nums2[j]) {                 for (k = 0; k < *returnSize; k++) {                     if (nums1[i] == array[k])                         break;                 }                 if (k >= *returnSize)                     array[(*returnSize)++] = nums1[i];             }         }     }      /*     int *array=(int *)malloc(sizeof(int)*nums1Size);     *returnSize=0;     int temp;     int hash[MAXSIZE]={0};     for(int i=0;i<nums1Size;i++){         hash[nums1[i]]++;     }     for(int j=0;j<nums2Size;j++){         if(hash[nums2[j]]>0){             array[(*returnSize)++]=nums2[j];             hash[nums2[j]]=0;         }     }     */     return array; }  int main(void) {     //int arr1[] = {1, 2, 2, 1};     //int arr2[] = {2, 2};     int arr1[] = {9, 4, 9, 8, 4};     int arr2[] = {4, 9, 5};     int *parr, size, i;      parr = intersection(arr1, 5, arr2, 3, &size);      if (!parr)         return -1;     for (i = 0; i < size; i++)         printf("%d ", parr[i]);     putchar(10);      free(parr);     return 0; }

user: user-1
content: #include <stdio.h> #include <stdlib.h>  //#define MAXSIZE 1024  #define min(x, y) ((x) > (y) ? (y):(x)) int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) {      int min_size = min(nums1Size, nums2Size), *array;     int i, j, k;        array = (int *)malloc(sizeof(int) * min_size);     if (!array)         return NULL;      *returnSize = 0;     for (i = 0; i < nums1Size; i++) {         for (j = 0; j < nums2Size; j++) {             if (nums1[i] == nums2[j]) {                 for (k = 0; k < *returnSize; k++) {                     if (nums1[i] == array[k])                         break;                 }                 if (k >= *returnSize)                     array[(*returnSize)++] = nums1[i];             }         }     }      /*     int *array=(int *)malloc(sizeof(int)*nums1Size);     *returnSize=0;     int temp;     int hash[MAXSIZE]={0};     for(int i=0;i<nums1Size;i++){         hash[nums1[i]]++;     }     for(int j=0;j<nums2Size;j++){         if(hash[nums2[j]]>0){             array[(*returnSize)++]=nums2[j];             hash[nums2[j]]=0;         }     }     */     return array; }  int main(void) {     //int arr1[] = {1, 2, 2, 1};     //int arr2[] = {2, 2};     int arr1[] = {9, 4, 9, 8, 4};     int arr2[] = {4, 9, 5};     int *parr, size, i;      parr = intersection(arr1, 5, arr2, 3, &size);      if (!parr)         return -1;     for (i = 0; i < size; i++)         printf("%d ", parr[i]);     putchar(10);      return 0; } 供参考～  不是用的hash，而是用的比较和查询

user: user-2
content: 引用 2 楼 weixin_45906870 的回复：我第一反应想到的也是这种方法，此外，用哈希表拉链法也可以。上面的1024范围不是我定的，只是leetcode测试的例子中没有超过1024这个范围，那如果题目没有告诉你具体范围，是不是就只能这样不断扩大范围去试试了？没有更巧妙的方法了吗？这种方法简练，但是有局限性，除非你用stl的set或map来做。 不告诉范围，还想用这种方法，就自己找出最大最小值，范围就能确定了。但是如果范围很大会浪费内存空间，不可取。 所以，可以把两个数组排好序后，同时遍历两个数组来查找共同元素。

user: user-0
content: 我第一反应想到的也是这种方法，此外，用哈希表拉链法也可以。上面的1024范围不是我定的，只是leetcode测试的例子中没有超过1024这个范围，那如果题目没有告诉你具体范围，是不是就只能这样不断扩大范围去试试了？没有更巧妙的方法了吗？

user: user-2
content: 你这里的是不是限定了条件nums[i]最大不超过1024？否则hash[nums1[i]]会数组越界。 如果负数也限制最小不超过-1024，那么改法很简单，nums的范围是[-1023, 1023]，变一下就是[0, 2046]，也就是把每个数都加上1023（就好比坐标系平移），这样hash依然可用（也就是数组下标控制一下即可）。 所以，把MAXSIZE改成2048，然后 统计时每个nums[i]+1023，即hash[nums1[i]+1023]++ 判断时if(hash[nums2[j]+1023]>0)就好了  所以修改以下代码即可 for(i=0; i<nums1Size; i++) {     hash[nums1[i]+1023]++; } for(j=0; j<nums2Size; j++) {     if(hash[nums2[j]+1023]>0) {         array[(*returnSize)++] = nums2[j]; //这里nums2[j]是负数也没关系         hash[nums2[j]+1023] = 0;     } }