【算法】查找类问题--两个数组的交集

查找类问题主要有两类:

  1. 查找有无
    • 元素‘a’ 是否存在?这种情况经常使用的数据结构是 set
  2. 查找对应关系(简直对应)
    • 元素‘a’出现了几次?这种情况下一般使用 map

示例1:

package solution.search;

import leetcode.array.important.Intersect;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

/**
 * @description 349. 两个数组的交集
 * 给定两个数组,编写一个函数来计算它们的交集。
 * 

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

* 示例 2: * 输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4] * 输出: [9,4] *

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

* 来源:力扣(LeetCode) * 链接:https://leetcode-cn.com/problems/intersection-of-two-arrays * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 * @className Intersection349 */ public class Intersection349 { public static void main(String[] args) { int[] nums1 = {4, 9, 5}, nums2 = {9, 4, 9, 8, 4}; System.out.println(Arrays.toString(intersection(nums1, nums2))); } /** * 典型的查找类问题 * 使用set * * @param nums1 数组1 * @param nums2 数组2 * @return int[] */ private static int[] intersection(int[] nums1, int[] nums2) { Set set1 = new HashSet<>(); for (int i : nums1) { set1.add(i); } Set set2 = new HashSet<>(); for (int num : nums2) { if (set1.contains(num)) { set2.add(num); } } int[] nums3 = new int[set2.size()]; if (set2.size() > 0) { int index = 0; for (Integer integer : set2) { nums3[index++] = integer; } } return nums3; } }

示例2:

package solution.search;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @description 350. 两个数组的交集 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] *

* 说明: * 输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。 * 我们可以不考虑输出结果的顺序。 *

* 进阶: * 如果给定的数组已经排好序呢?你将如何优化你的算法? * 如果 nums1 的大小比 nums2 小很多,哪种方法更优? * 如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办? *

* 来源:力扣(LeetCode) * 链接:https://leetcode-cn.com/problems/intersection-of-two-arrays-ii * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 * @className Intersect350 */ public class Intersect350 { public static void main(String[] args) { int[] nums1 = {4, 9, 5}, nums2 = {9, 4, 9, 8, 4}; System.out.println(Arrays.toString(intersect(nums1, nums2))); } private static int[] intersect(int[] nums1, int[] nums2) { List list1 = new ArrayList<>(); for (int i : nums1) { list1.add(i); } List list = new ArrayList<>(); for (int num : nums2) { if (list1.contains(num)) { list.add(num); list1.remove(Integer.valueOf(num)); } } int[] nums3 = new int[list.size()]; if (list.size() > 0) { int index = 0; for (Integer integer : list) { nums3[index++] = integer; } } return nums3; } }

你可能感兴趣的:(数据结构和算法学习)