問題:
Given two arrays, write a function to compute their intersection.
Example:
Given nums1 = [1, 2, 2, 1], nums2 = [2, 2], return [2, 2].
Note:
Each element in the result should appear as many times as it shows in both arrays.
The result can be in any order.
Follow up:
What if the given array is already sorted? How would you optimize your algorithm?
What if nums1's size is small compared to nums2's size? Which algorithm is better?
What if elements of nums2 are stored on disk, and the memory is limited such that you cannot load all elements into the memory at once?
大意:
給出兩個(gè)數(shù)組编振,寫一個(gè)函數(shù)來計(jì)算他們的交叉點(diǎn)。
例子:
給出數(shù)組 nums1 = [1,2,2,1],nums2 = [2,2],返回[2,2]。
注意:
在結(jié)果中每個(gè)元素出現(xiàn)的次數(shù)應(yīng)該與他們在兩個(gè)數(shù)組中出現(xiàn)的次數(shù)一樣遗遵。
結(jié)果可以是亂序的。
進(jìn)階:
如果給出的數(shù)組已經(jīng)是排好序的呢?你會(huì)如何優(yōu)化你的算法臼膏?
如果nums1的尺寸比nums2要小呢?哪個(gè)算法更好示损?
如果nums2中的元素是存儲(chǔ)在硬盤上的渗磅,而由于內(nèi)存是有限的你不能一次把所有元素都加載到內(nèi)存中,怎么辦?
思路:
這個(gè)問題是之前一個(gè)問題的簡單變形:傳送門:LeetCode筆記:349. Intersection of Two Arrays始鱼。這個(gè)題目的變化在于他不要求每個(gè)數(shù)字只出現(xiàn)一次了仔掸,而是要求交叉了幾次就保留幾次,這其實(shí)更簡單医清,還是之前題目的解法起暮,把保障數(shù)字唯一性的代碼去掉就好了,速度依然很快会烙,3ms负懦。
對于它提出來的三個(gè)問題,解答如下:
- 如果數(shù)組已經(jīng)排好序了柏腻,更簡單纸厉,把排序過程都省掉。
- 如果nums1尺寸更小五嫂,這其實(shí)對于我的解法不影響颗品,反正哪個(gè)數(shù)組先遍歷完都會(huì)結(jié)束循環(huán)。
- 如果nums2的元素不能一次讀取沃缘,那就一個(gè)個(gè)讀取然后在nums1中尋找相同的數(shù)字躯枢,只是如果找到了記得要在nums1中去掉該位置的數(shù)字,等把nums2比較完了或者nums1被減沒了就結(jié)束了孩灯。
代碼(Java):
public class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
int results[] = new int[nums1.length];// 結(jié)果數(shù)組
// 沒有數(shù)字的情況
if (nums1.length == 0 || nums2.length == 0) {
return new int[0];
}
// 先對兩個(gè)數(shù)組排序
Arrays.sort(nums1);
Arrays.sort(nums2);
int index = 0;
for (int i = 0, j = 0; i < nums1.length; ) {
if (nums1[i] < nums2[j]) {// 第一個(gè)數(shù)組中數(shù)字小
i++;
} else if (nums1[i] == nums2[j]) {// 數(shù)字相同闺金,放入結(jié)果數(shù)組
results[index] = nums1[i];
index++;
i++;
// 判斷第二個(gè)數(shù)組有沒有到最后一個(gè)數(shù)組,還沒到才繼續(xù)往后移去比
if (j < nums2.length-1) j++;
else break;
} else {// 第二個(gè)數(shù)組中數(shù)字小峰档,注意要判斷是否到達(dá)最后一個(gè)數(shù)字
if (j < nums2.length-1) j++;
else break;
}
}
return Arrays.copyOfRange(results, 0, index);// 結(jié)果數(shù)組只返回有數(shù)字的那一部分
}
}
合集:https://github.com/Cloudox/LeetCode-Record