349.两个数组的交集

  1. 349.两个数组的交集
    1. 349.1 题目
    2. 349.2 题解
      1. List存储交集元素
      2. 排序双指针
    3. 349.3 代码
    4. 349.4 运行结果

349.两个数组的交集


349.1 题目

给定两个数组 nums1nums2,返回它们的交集。输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺序。

示例 1:

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

示例 2:

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的

提示:

  • 1 <= nums1.length, nums2.length <= 1000
  • 0 <= nums1[i], nums2[i] <= 1000

349.2 题解

List存储交集元素

// 方法一:List存储交集元素
// 使用List找交集
static int[] Intersect1(int[] nums1, int[] nums2)
{
    // 创建一个 List 用于存储不重复的 nums1 元素
    List<int> nums1List = new List<int>();

    // 遍历 nums1 数组
    for (int i = 0; i < nums1.Length; i++)
    {
        // 判断 nums1List 中是否已包含当前元素
        if (!nums1List.Contains(nums1[i]))
        {
            // 如果不包含,将当前元素添加到 nums1List 中
            nums1List.Add(nums1[i]);
        }
    }

    // 使用 List 存储交集元素
    List<int> intersectList = new List<int>();

    // 遍历 nums2 数组
    for (int i = 0; i < nums2.Length; i++)
    {
        // 判断当前元素是否存在于 nums1List 中且还未被加入交集
        if (nums1List.Contains(nums2[i]) && !intersectList.Contains(nums2[i]))
        {
            // 将当前元素加入交集 List
            intersectList.Add(nums2[i]);
        }
    }

    // 将 List 转换为数组并返回
    return intersectList.ToArray();
}

排序双指针

// 方法二:排序双指针
// 对两个数组排序,双指针分别遍历两个数组,元素相等加到交集列表移动两个指针,不等移动较小的指针,返回交集列表变成数组
static int[] Intersect2(int[] nums1, int[] nums2)
{
    // 对数组 nums1 进行排序
    Array.Sort(nums1);

    // 对数组 nums2 进行排序
    Array.Sort(nums2);

    // 用于存储交集元素的 List
    List<int> intersectList = new List<int>();

    // 初始化两个数组的索引
    int nums1Index = 0;
    int nums2Index = 0;

    // 使用双指针遍历两个排序后的数组
    while (nums1Index < nums1.Length && nums2Index < nums2.Length)
    {
        // 如果两个元素相等,表示找到一个交集元素
        if (nums1[nums1Index] == nums2[nums2Index])
        {
            // 判断交集中是否已包含当前元素,避免重复添加相同的元素
            if (!intersectList.Contains(nums1[nums1Index]))
            {
                // 将当前元素加入交集 List
                intersectList.Add(nums1[nums1Index]);
            }

            // 向前移动两个数组的索引
            nums1Index++;
            nums2Index++;
        }
        // 如果 nums1 数组中的元素小于 nums2 数组中的元素
        else if (nums1[nums1Index] < nums2[nums2Index])
        {
            // 只需将 nums1 的索引向前移动,因为较小的元素可能在 nums1 数组中找到匹配
            nums1Index++;
        }
        // 如果 nums1 数组中的元素大于 nums2 数组中的元素
        else if (nums1[nums1Index] > nums2[nums2Index])
        {
            // 只需将 nums2 的索引向前移动,因为较小的元素可能在 nums2 数组中找到匹配
            nums2Index++;
        }
    }

    // 将 List 转换为数组并返回
    return intersectList.ToArray();
}

349.3 代码

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        #region 题目

        // 给定两个数组 nums1 和 nums2,返回它们的交集。
        // 输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺序。

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

        // 示例 2:
        // 输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
        // 输出:[9,4]
        // 解释:[4,9] 也是可通过的

        // 提示:
        // 1 <= nums1.length, nums2.length <= 1000
        // 0 <= nums1[i], nums2[i] <= 1000

        #endregion

        #region 测试

        // 示例 1
        int[] nums1 = { 1, 2, 2, 1 };
        int[] nums2 = { 2, 2 };
        int[] result1 = Intersect1(nums1, nums2);
        Console.WriteLine($"示例1 方法1 输出:[{string.Join(", ", result1)}]");
        int[] result1_2 = Intersect2(nums1, nums2);
        Console.WriteLine($"示例1 方法2 输出:[{string.Join(", ", result1_2)}]");

        // 示例 2
        int[] nums3 = { 4, 9, 5 };
        int[] nums4 = { 9, 4, 9, 8, 4 };
        int[] result2 = Intersect1(nums3, nums4);
        Console.WriteLine($"示例2 方法1 输出:[{string.Join(", ", result2)}]");
        int[] result2_2 = Intersect2(nums3, nums4);
        Console.WriteLine($"示例2 方法2 输出:[{string.Join(", ", result2_2)}]");

        #endregion
    }

    #region 答案

    // 方法一:List存储交集元素
    // 使用List找交集
    static int[] Intersect1(int[] nums1, int[] nums2)
    {
        // 创建一个 List 用于存储不重复的 nums1 元素
        List<int> nums1List = new List<int>();

        // 遍历 nums1 数组
        for (int i = 0; i < nums1.Length; i++)
        {
            // 判断 nums1List 中是否已包含当前元素
            if (!nums1List.Contains(nums1[i]))
            {
                // 如果不包含,将当前元素添加到 nums1List 中
                nums1List.Add(nums1[i]);
            }
        }

        // 使用 List 存储交集元素
        List<int> intersectList = new List<int>();

        // 遍历 nums2 数组
        for (int i = 0; i < nums2.Length; i++)
        {
            // 判断当前元素是否存在于 nums1List 中且还未被加入交集
            if (nums1List.Contains(nums2[i]) && !intersectList.Contains(nums2[i]))
            {
                // 将当前元素加入交集 List
                intersectList.Add(nums2[i]);
            }
        }

        // 将 List 转换为数组并返回
        return intersectList.ToArray();
    }


    // 方法二:排序双指针
    // 对两个数组排序,双指针分别遍历两个数组,元素相等加到交集列表移动两个指针,不等移动较小的指针,返回交集列表变成数组
    static int[] Intersect2(int[] nums1, int[] nums2)
    {
        // 对数组 nums1 进行排序
        Array.Sort(nums1);

        // 对数组 nums2 进行排序
        Array.Sort(nums2);

        // 用于存储交集元素的 List
        List<int> intersectList = new List<int>();

        // 初始化两个数组的索引
        int nums1Index = 0;
        int nums2Index = 0;

        // 使用双指针遍历两个排序后的数组
        while (nums1Index < nums1.Length && nums2Index < nums2.Length)
        {
            // 如果两个元素相等,表示找到一个交集元素
            if (nums1[nums1Index] == nums2[nums2Index])
            {
                // 判断交集中是否已包含当前元素,避免重复添加相同的元素
                if (!intersectList.Contains(nums1[nums1Index]))
                {
                    // 将当前元素加入交集 List
                    intersectList.Add(nums1[nums1Index]);
                }

                // 向前移动两个数组的索引
                nums1Index++;
                nums2Index++;
            }
            // 如果 nums1 数组中的元素小于 nums2 数组中的元素
            else if (nums1[nums1Index] < nums2[nums2Index])
            {
                // 只需将 nums1 的索引向前移动,因为较小的元素可能在 nums1 数组中找到匹配
                nums1Index++;
            }
            // 如果 nums1 数组中的元素大于 nums2 数组中的元素
            else if (nums1[nums1Index] > nums2[nums2Index])
            {
                // 只需将 nums2 的索引向前移动,因为较小的元素可能在 nums2 数组中找到匹配
                nums2Index++;
            }
        }

        // 将 List 转换为数组并返回
        return intersectList.ToArray();
    }

    #endregion
}

349.4 运行结果

示例1 方法1 输出:[2]
示例1 方法2 输出:[2]
示例2 方法1 输出:[9, 4]
示例2 方法2 输出:[4, 9]


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏