返回

哈希表巧妙求交集,高效算法助你轻松解题

后端

在编程的世界中,数组是一种常用的数据结构,它允许我们存储一系列元素并通过索引访问它们。有时候,我们需要求出两个数组的交集,即找到两个数组中都存在的元素。使用哈希表可以巧妙地解决这个问题,哈希表是一种快速查找数据结构,它允许我们通过键值快速查找对应的值。

哈希表的核心思想是将数据项映射到一个键上,然后通过这个键快速查找数据项。在求两个数组交集的问题中,我们可以将其中一个数组的元素作为键值存入哈希表中,然后遍历另一个数组并检查其元素是否在哈希表中。如果一个元素在哈希表中,则它属于两个数组的交集。

哈希表的优势在于它的查找速度非常快,通常为O(1),即常数时间。因此,使用哈希表求两个数组的交集的时间复杂度为O(m+n),其中m和n分别为两个数组的长度,而空间复杂度为O(m),其中m为第一个数组的长度。

为了更好地理解哈希表如何求两个数组的交集,让我们来看一个具体的代码示例:

import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;

public class IntersectionOfTwoArrays {

    public static int[] intersection(int[] nums1, int[] nums2) {
        // 创建哈希表
        HashMap<Integer, Boolean> map = new HashMap<>();

        // 将第一个数组的元素作为键值存入哈希表中
        for (int num : nums1) {
            map.put(num, true);
        }

        // 创建集合来存储两个数组的交集
        Set<Integer> intersection = new HashSet<>();

        // 遍历第二个数组并检查其元素是否在哈希表中
        for (int num : nums2) {
            if (map.containsKey(num)) {
                // 如果元素在哈希表中,则它属于两个数组的交集
                intersection.add(num);
            }
        }

        // 将集合转换为数组并返回
        return intersection.stream().mapToInt(Integer::intValue).toArray();
    }

    public static void main(String[] args) {
        int[] nums1 = {1, 2, 3, 4, 5};
        int[] nums2 = {3, 4, 5, 6, 7};

        int[] intersection = intersection(nums1, nums2);

        // 打印两个数组的交集
        System.out.println("Intersection of two arrays:");
        for (int num : intersection) {
            System.out.print(num + " ");
        }
    }
}

在这个代码示例中,我们首先创建了一个哈希表,然后将第一个数组的元素作为键值存入哈希表中。然后,我们创建了一个集合来存储两个数组的交集。接下来,我们遍历第二个数组并检查其元素是否在哈希表中。如果一个元素在哈希表中,则它属于两个数组的交集,我们将其添加到集合中。最后,我们将集合转换为数组并返回。

使用哈希表求两个数组交集的算法简单易懂,并且时间复杂度和空间复杂度都非常低。这种算法广泛用于编程中,比如查找两个列表的交集、查找两个字符串的公共字符等。