学校に戻る:2番目の質問-349。2つの配列の共通部分

2つの配列が与えられた場合、それらの交点を計算する関数を記述します。

示例 1:

输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
示例 2:

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

说明:

输出结果中的每个元素一定是唯一的。
我们可以不考虑输出结果的顺序。

回答:

この質問は2つの配列の交差に似ています||、違いは、交差の1つの要素のみを出力する必要があることです。つまり、交差に複数の2がある場合、2を出力します。反発は同様です。
したがって、2つの方法もあります。

1.ハッシュテーブル:
この問題はハッシュテーブルを使用すると簡単に解決できます。配列1、2に表示される数値の数を格納するために、2つのハッシュテーブルを作成し、2つのハッシュテーブルを比較するだけで済みます。特定の数の0ではない場合、それらには交差があり、交差番号を直接出力するだけです。(ここでは、デフォルトの番号範囲は0〜10000です。Likouのテストケースは完全には合格できないと思いましたが、最終的に合格することがわかりました。)

コード:

int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){
    
    
    int*temp=(int*)malloc(sizeof(int)*nums1Size);
    int hash1[10001]={
    
    0};
    int hash2[10001]={
    
    0};
    for(int i=0;i<nums1Size;i++)
    {
    
    
        hash1[nums1[i]]++;
    }
    for(int i=0;i<nums2Size;i++)
    {
    
    
        hash2[nums2[i]]++;
    }
    int index = 0;
    for(int i=0;i<=10000;i++)
    {
    
    
        if(hash1[i]==0||hash2[i]==0)
        {
    
    
            continue;
        }
        else
        {
    
    
            temp[index++]=i;
        }
    }
    *returnSize=index;
    return temp;
}

2.並べ替え+ダブルポインタ:
最初に2つの交点を計算し、次に配列を作成し、前者を選択します。つまり、繰り返される数は1回だけで済みます。

コード:

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int cmp(int*x,int*y)
{
    
    
    return *x>*y;
}
int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){
    
    
    int*temp=(int*)malloc(sizeof(int)*nums1Size);
    qsort(nums1,nums1Size,sizeof(int),cmp);
    qsort(nums2,nums2Size,sizeof(int),cmp);
    int i=0;
    int j=0;
    int index = 0;
    while(i<nums1Size&&j<nums2Size)
    {
    
    
        if(nums1[i]==nums2[j])
        {
    
    
            temp[index++]=nums1[i++];
            j++;
            continue;
        }
        else
        {
    
    
            if(nums1[i]>nums2[j])
            {
    
    
                j++;
                continue;
            }
            else
            {
    
    
                i++;
                continue;
            }
        }
    }
    int*temp2=(int*)malloc(sizeof(int)*index);
    int index2 = 0;
    for(int n=0;n<index;n++)
    {
    
    
        if(n==0)
        {
    
    
            temp2[index2++]=temp[n];
            continue;
        }
        else
        {
    
    
            if(temp[n]==temp[n-1])
            {
    
    
                continue;
            }
            else
            {
    
    
                temp2[index2++]=temp[n];
                continue;
            }
        }
    }
    *returnSize=index2;
    free(temp);
    return temp2;
}

おすすめ

転載: blog.csdn.net/xiangguang_fight/article/details/114373914