题目描述:
代码解决:
class Solution { public: vector<int> intersection(vector<int>& nums1, vector<int>& nums2) { // 创建一个无序集合result_set,用于存储结果(交集元素) unordered_set<int> result_set; // 创建一个无序集合nums_set,并用nums1的元素初始化 unordered_set<int> nums_set(nums1.begin(), nums1.end()); // 遍历nums2的每个元素 for (int num : nums2) { // 如果nums_set中存在num,将其添加到result_set中 if (nums_set.find(num) != nums_set.end()) { result_set.insert(num); } } // 将result_set中的元素转换为向量并返回 return vector<int>(result_set.begin(), result_set.end()); } };
这段代码实现了
intersection
函数,该函数返回两个整数向量nums1
和nums2
的交集。交集是指同时出现在两个向量中的元素,且不包含重复的元素。代码中使用了一个
unordered_set
来存储结果,这是因为unordered_set
可以自动去除重复元素,并且提供了快速的查找能力。首先,将nums1
的元素插入到unordered_set
nums_set
中。然后,遍历nums2
,对于每个元素,检查它是否存在于nums_set
中。如果存在,就将它插入到result_set
中。最后,将result_set
转换成vector
并返回。这里是详细的步骤:
- 创建一个空的
unordered_set
result_set
,用于存储交集。- 创建一个
unordered_set
nums_set
,并将nums1
的元素插入到其中。由于unordered_set
会自动去重,所以nums_set
中只包含nums1
中的唯一元素。- 遍历
nums2
中的每个元素num
。- 使用
find
函数在nums_set
中查找num
。如果找到了,说明num
是交集的一部分,应该被加入到result_set
中。- 将
result_set
转换成vector
,因为题目要求返回的是一个向量。- 返回结果向量。
这个实现的时间复杂度是O(m + n),其中m是
nums1
的长度,n是nums2
的长度。空间复杂度是O(m),因为需要存储nums1
的元素集合。如果nums1
和nums2
的元素非常多,这可能会导致较大的内存使用。如果内存使用是一个问题,可以考虑只存储较小数组的元素集合,并在较大的数组上执行查找操作。解法二:
class Solution { public: vector<int> intersection(vector<int>& nums1, vector<int>& nums2) { // 创建一个无序集合result_set,用于存储结果(交集元素) unordered_set<int> result_set; int hash[1005]={0}; for(int num:nums1) { hash[num]=1; } for(int num:nums2) { if(hash[num]==1) { result_set.insert(num); } } // 将result_set中的元素转换为向量并返回 return vector<int>(result_set.begin(), result_set.end()); } };
这段代码也是用于解决求两个整数向量
nums1
和nums2
交集的问题。与之前的代码不同,这段代码使用了一个整型数组hash
来代替unordered_set
来存储nums1
中的元素。以下是代码的步骤:
初始化一个大小为1005的整型数组
hash
,所有元素都设为0。这里假设nums1
和nums2
中的元素都是非负数,并且最大值不会超过1004。如果有不同的范围,需要相应地调整数组的大小。遍历
nums1
中的每个元素num
,将hash[num]
设为1,表示nums1
中存在这个元素。遍历
nums2
中的每个元素num
,检查hash[num]
是否为1。如果为1,说明num
同时存在于nums1
和nums2
中,将其插入到result_set
中。将
result_set
中的元素转换为向量并返回。这个实现的时间复杂度是O(m + n),其中m是
nums1
的长度,n是nums2
的长度。空间复杂度是O(1),因为使用的额外空间(数组hash
)的大小是固定的,与输入字符串的长度无关。这种方法在元素的范围较小且已知时是有效的,但如果元素的范围很大或者未知,那么这种方法可能不适用,因为数组的大小将受到限制。