【力扣LeetCode】 350_两个数组的交集II(原题的中文题目不太正确)
- 第 129 篇 -
Date: 2025 - 09 - 23
Author: 郑龙浩(仟墨)
文章目录
- 【力扣LeetCode】 350_两个数组的交集II(原题的中文题目不太正确)
- 题目描述
- 思路
- 代码
【力扣LeetCode】 350_两个数组的交集II(原题的中文题目不太正确)
题目描述
给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
思路
-
排序预处理:先对两个数组进行排序,使相同元素相邻排列
-
双指针扫描:
-
初始化两个指针i,j分别指向两数组起始位置
-
比较当前元素大小:
nums1[i] < nums2[j] → i++
nums1[i] > nums2[j] → j++
相等时收集该元素,双指针同时前进
- 结果收集:将所有相等的元素按出现次数保存到结果数组
代码
// 350_两个数组的交集II_原题表述存在问题
// Author: 郑龙浩 Date: 2025年09月19日
// 用时:18min
#include "bits/stdc++.h"
using namespace std;
// 思路:双指针法
// 与349题不同,不需要去重了
// 先对两个数组进行排序
// 使用双指针,不断将两个数组中重复元素插入一个新的数组
class Solution {
public:vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {vector <int> ans_nums;int i = 0, j = 0;int len1 = nums1.size(), len2 = nums2.size();sort(nums1.begin(), nums1.end());sort(nums2.begin(), nums2.end());while (i < len1 && j < len2) {if (nums1[i] < nums2[j])i++;else if (nums1[i] > nums2[j])j++;else {ans_nums.push_back(nums1[i]); // 元素相同就插入i++; j++;}} return ans_nums;}
};
int main(void) {ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);vector <int> nums1 = {1, 2, 2, 1}, nums2 = {2, 2};// vector <int> nums1 = {4, 9, 5}, nums2 = {9, 4, 9, 8, 4};Solution sol;auto ans = sol.intersect(nums1, nums2);for (auto it = ans.begin(); it != ans.end(); it++) {cout << *it << ' ';}return 0;
}