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;
}