题目:
给定两个数组,编写一个函数来计算它们的交集。
示例 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; Listres = 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; } }