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 num2'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?
例如:
给定 nums1 = [1, 2, 2, 1] , nums2 = [2, 2] ,应当返回 [2, 2] 。
注意:
- 每一个在结果中的元素的出现次数都应该和它在两个数组中出现的次数一样多。(对于上面那个例子,因为2在nums1和nums2中都出现了两次,因此结果中会有两个2)
- 结果的顺序任意。
- 如果给定数组是已排序的数组,你会怎样修改你的算法?((假定数组按升序排列的话)我觉得可以比较两个数组的第一个元素,选出大的那一方,然后在较小的那一个数组里找到对应位置,再从对应位置开始向后搜索;如果找不到大于等于它的元素,那么可以直接返回0)
- 如果nums1的元素个数小于nums2的元素个数怎么办?哪种算法更好?(大概就是n*m与m*n的差别吧。。。这个问题应该和计组有关,但是我现在手边没有书,等之后再答)
- 如果numd2的元素均存储在硬盘上,而你现有的内存无法一次读取出所有nums2的元素你会怎么办?(不懂,need help!)
我能想到的方法只有全部遍历一遍。。。
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
vector<int> vec;
if(nums1.size() == 0 || nums2.size() == 0) return vec;
int min;
min = nums1.size();
int len = nums2.size();
for(int i = 0 ; i < min ; i++){
int it = nums1[i];
for(vector<int>::iterator j = nums2.begin() ; j < nums2.end() ; j++){
if(it == *j){
vec.push_back(it);
nums2.erase(j);
break;
}
}
}
return vec;
}
};