[349].兩個數組的交集

 


題目

給定兩個數組,編寫一個函數來計算它們的交集。

示例 1:

輸入: nums1 = [1,2,2,1], nums2 = [2,2]
輸出: [2]

示例 2:

輸入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
輸出: [9,4]

 


函數原型

C 的函數原型:

int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){}

 


邊界判斷

int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize)
{

}

 


算法設計:查找表

思路:先建立一個集合set,而後查找某個元素是否在 set 中。

  • 建立 setset:遍歷 nums1nums1 將值映射到 setset 數組中,標記爲存在
  • 查找有無:再遍歷 nums2nums2 的值,查詢 setset 中是否存在
  • 若存在就是交集元素,並將 setset 值標記爲不存在(去重處理)
int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){
    int len = 1<<10;
    int *set = calloc(len, sizeof(int));
    int *res = calloc(len, sizeof(int));

    for(int i=0; i<nums1Size; i++)
        set[ nums1[i] ] = 1;

    int cnt = 0;
    for(int i=0; i<nums2Size; i++)
        if( set[ nums2[i] ] != 0 ){
            res[cnt++] = nums2[i];
            set[ nums2[i] ] = 0;		// 去重,重複賦值爲 0
        }
    *returnSize = cnt;
	free(set), set = NULL;
    return res;
}

查找表複雜度:

  • 時間複雜度:Θ(n+m)\Theta(n+m)
  • 空間複雜度:Θ(n)\Theta(n)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章