数组交集

题目:

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

示例 1:

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

示例 2:

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

说明:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/intersection-of-two-arrays-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

分析:

这道题目比较容易想到暴力解法,嵌套循环跑起来,干就完事了。但是,既然是在学习算法,还是尽量做一下优化比较好。我的思路就是先将数组从小到大排序,然后从前往后遍历,如果发现两个数组中有相同的值,那么添加进结果集,并且记录当前值的下标,下一次循环时,就没必要从下标0开始遍历了,因为数组现在已经是有序的了,所以,可以利用记录下标的方式减少一些判断。排序算法本来是想手动实现,但是考虑到这方面学习的不多,最终决定使用Arrays.sort()方法进行排序。

代码:

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        if (nums1.length == 0 | nums1 == null | nums2.length == 0 | nums2 == null) {
            return new int[0];
        }
        Arrays.sort(nums1);
        Arrays.sort(nums2);
        int[] shortArr ,longArr;
        if (nums1.length >= nums2.length) {
            longArr = nums1;
            shortArr = nums2;
        } else {
            shortArr = nums1;
            longArr = nums2;
        }
        int currInt = 0;
        int curr = 0;
        List<Integer> res = new ArrayList<>();
        for (int i = 0; i < shortArr.length; i++) {
            currInt = shortArr[i];
            for (int j = curr; j < longArr.length; j++) {
                if (longArr[j] == shortArr[i]) {
                    curr = j + 1;
                    res.add(shortArr[i]);
                    break;
                }
            }
        }
        int[] result = new int[res.size()];
        for (int i = 0; i < res.size(); i++) {
            result[i] = res.get(i);
        }
        return result;
    }
}
原文地址:https://www.cnblogs.com/wxdmw/p/13291716.html