标签:shm 函数 hash 大小 说明 进阶 元素 lis 内存
给定两个数组,编写一个函数来计算它们的交集。
示例 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 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?
思路:两个数组未排序 => 使用HashMap查找
class Solution { public int[] intersect(int[] nums1, int[] nums2) { target = new HashMap<>(); List<Integer> resultList = new ArrayList<Integer>(); if(nums1.length < nums2.length) { insertMap(nums1); findIntersect(nums2, resultList); } else { insertMap(nums2); findIntersect(nums1, resultList); } int[] arr = new int[resultList.size()]; for(int i = 0; i < resultList.size(); i++){ arr[i] = resultList.get(i); } return arr; } private void insertMap(int[] nums){ //短的数组放入HashMap for (int i = 0; i < nums.length; i++){ if(target.containsKey(nums[i])){ target.put(nums[i], target.get(nums[i])+1); } else { target.put(nums[i], 1); } } } private void findIntersect(int[] nums, List<Integer> resultList){ for(int i = 0; i < nums.length; i++){ if(target.containsKey(nums[i]) && target.get(nums[i]) > 0){ resultList.add(nums[i]); target.put(nums[i], target.get(nums[i])-1); } } } private Map<Integer, Integer> target; }
标签:shm 函数 hash 大小 说明 进阶 元素 lis 内存
原文地址:https://www.cnblogs.com/qionglouyuyu/p/13296546.html