两个数组的交集-LeetCode(Java实现)

题目描述:

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

示例 1:

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

示例 2:

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

说明:

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

解题思路:

  1. 写一个工具类,可以在给定数组中查找是否有指定元素的存在。
  2. 创建一个新数组,用于存放两数组交集的元素,初始长度为两数组中较小数组的长度。
  3. 因为输出结果中的元素是唯一的,也就是不能重复。所以先将一个数组排序。
  4. 遍历排序后的数组中的每一个元素(如果该元素不唯一,则跳过此元素),查询每个元素在另一个数组中是否存在,如果存在,则将此元素存放进新数组中。

代码实现:

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
                int m = nums1.length;
        int n = nums2.length;
        if (m < 1 || n < 1) {
            return new int[]{};
        }else if (m < 1 && n < 1) {
            return nums1;
        }
        int num = m<n?m:n;
        int[] arr = new int[num];
        int k = 0;
        int count = 0; //交集元素的个数
        Arrays.sort(nums1);
        if (ensureNumber(nums2,nums1[0])) {
            arr[k++] = nums1[0];
            count++;
        }
        for (int i = 1; i < m; i++) {
            if (nums1[i] != nums1[i-1] && ensureNumber(nums2,nums1[i])) {
                arr[k++] = nums1[i];
                count++;
            }
        }
        int[] result = new int[count];
        for (int i = 0; i < result.length; i++) {
            result[i] = arr[i];
        }
        return result;
    }

    /**
     * 检查给定数组中是否有指定数值
     * @param arr 给定数组
     * @param value 给定数值
     * @return 如果存在,返回true,否则返回false
     */
    public boolean ensureNumber(int[] arr, int value) {
        Arrays.sort(arr);
        int l = 0;
        int r = arr.length - 1;
        while (l <= r) {
            int mid = l + (r-l)/2;
            if (arr[mid] > value) {
                r = mid - 1;
            }else if (arr[mid] < value) {
                l = mid + 1;
            }else {
                return true;
            }
        }
        return false;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43573824/article/details/88920997
今日推荐