LeetCode 350、两个数组的交集II(c++)(0基础也可看懂附带语法)(官方数据结构入门计划第五题)

347 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情

[1]、哈希表

(假设数组A是元素多一点的数组,B数组是元素小一点)遍历两个数组中小的一个数组(也就是数组B),然后把数组B中每个数都存入哈希表中,然后再遍历数组A的每个元素,遍历的过程中每个元素都在要用依次哈希表,看哈希表是否有这个元素,如果有就证明有交集,就存储到要返回的目标数组里。

  vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
      if (nums1.size() > nums2.size()) {
          return intersect(nums2, nums1);
      }//调用小的数组,节省哈希表所用空间
      unordered_map <int, int>m;
      vector<int> intersection;
      for (int num : nums1) {
          ++m[num];
      }//用num变量遍历nums1数组
      for (int num : nums2) {
          if (m.count(num)) {
//检索一下当前检索的这个数在哈希表中是否存在
              intersection.push_back(num);
//如果没有就插入
              --m[num];
              if (m[num] == 0) {
//如果这个元素的在哈希表中的值变为0,就擦除这个元素,证明这个元素已经用过于取交集,否则的话count报错
                  m.erase(num);
              }
          }
      }
      return intersection;
  }

[2]、可以用c++内置函数

求交集,这个一开始我没想到,也是看题解才知道

vector<int> intersect(vector<int>& nums1, vector<int>& nums2){
                     sort(nums1.begin(),nums1.end());
                     sort(nums2.begin(),nums2.end());
                     nums1.erase(set_intersection(begin(nums1),end(nums2)),
                                 begin(nums1),end(nums1),begin(nums2),end(nums2));
                     return nums1;
}

[3]、排序+双指针

先对两个数组进行排序,然后用双指针,分别指向两个数组的头部,然后比较,指向较小的数的指针向右移动一位,如果相同就加入到结果数组中,然后同时向右移动一格。

  vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
      sort(nums1.begin(), nums1.end());
      sort(nums2.begin(), nums2.end());
      int length1 = nums1.size(), length2 = nums2.size();
      int index1 = 0, index2 = 0;
      vector<int> intersection;
      while (index1 < length1 && index2 < length2) {
          if (nums1[index1] < nums2[index2]) {
              index1++;
          }
          else if (nums1[index1] > nums2[index2]) {
              index2++;
          }
          else {
              intersection.push_back(nums1[index1]);
              index1++;
              index2++;
          }
      }
      return intersection;
  }

[4]、暴力法

  暴力法就是两个for去遍历,然后有相同元素就放入目标数组中,然后擦除erase,防止被重复计算

要注意erase的用法,这篇文章很详细,可以去看一下:

正确使用stl map的erase方法 - 小 楼 一 夜 听 春 雨 - 博客园 (cnblogs.com)

class Solution {
  public:
      vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
          vector<int> v;
          int count = 0;
          int num1Size = nums1.size();
          int num2Size = nums2.size();
          for (int i = 0; i < num1Size; i++) {
              for (vector<int>::iterator it = nums2.begin(); it != nums2.end(); it++) {
                  if (nums1[i] == *it) {
                      int cur = nums1[i];
                      v.push_back(nums1[i]);
                      nums2.erase(it);//有相同元素就放入目标元素,并删掉这个元素在数组中
                      break;
                  }
              }

          }
          return v;
      }
  };