天天看点

Leetcode算法题(C语言)7--两个数组的交集 II

题目:两个数组的交集 II

给定两个数组,编写一个函数来计算它们的交集。

示例 1:

输入: nums1 = [1,2,2,1], nums2 = [2,2]

输出: [2,2]

示例 2:

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

输出: [4,9]

说明:

输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。

我们可以不考虑输出结果的顺序。

代码实现:

/**
 * Return an array of size *returnSize.
 * Note: The returned array must be malloced, assume caller calls free().
 */
void Swap(int A[], int i, int j)
{
    int temp = A[i];
    A[i] = A[j];
    A[j] = temp;
}

int Partition(int A[], int left, int right)  // 划分函数
{
    int pivot = A[right];               // 这里每次都选择最后一个元素作为基准
    int tail = left - 1;                // tail为小于基准的子数组最后一个元素的索引
    for (int i = left; i < right; i++)  // 遍历基准以外的其他元素
    {
        if (A[i] <= pivot)              // 把小于等于基准的元素放到前一个子数组末尾
        {
            Swap(A, ++tail, i);
        }
    }
    Swap(A, tail + 1, right);           // 最后把基准放到前一个子数组的后边,剩下的子数组既是大于基准的子数组
                                        // 该操作很有可能把后面元素的稳定性打乱,所以快速排序是不稳定的排序算法
    return tail + 1;                    // 返回基准的索引
}

void QuickSort(int A[], int left, int right)
{
    if (left >= right)
        return;
    int pivot_index = Partition(A, left, right); // 基准的索引
    QuickSort(A, left, pivot_index - 1);
    QuickSort(A, pivot_index + 1, right);
}

int* intersect(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) {
    
    int len = nums2Size;
    int i, j, k = 0;
    int flag = 0;
    int *array_bak;
    
    /* 快速排序 */
    QuickSort(nums1, 0, nums1Size - 1);
    QuickSort(nums2, 0, nums2Size - 1);
    
    /* 处理特殊情况并获取数组长度 */
    if(nums1Size == 0)
        return;
    else if(nums2Size == 0)
        return;
    else if(nums1Size < nums2Size)
        len = nums1Size;
    
    int array[len];
    
    /* 判断数组中是否有交集 */
    for(i = 0; i < nums1Size; i++)
    {
        for(j = flag; j < nums2Size; j++)
        {
            if(nums1[i] == nums2[j])
            {
                array[k] = nums2[j];
                k++;
                flag = j + 1;
                break;
            }
        }
    }
    /* 返回数组大小 */
    *returnSize = k;
    /* 为返回数组分配空间 */
    array_bak = (int *)malloc(sizeof(int) * k);
    /* 为返回数组赋值 */
    memcpy(array_bak, array, sizeof(int) * k);
    return array_bak;
}
           

继续阅读