LeetCode 350 Intersection of Two Arrays II

題目:

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.
題目鏈接

題意:

給兩個數組,實現求出兩個數組的交集,並返回vector,要求返回的結果中單種元素出現次數應與兩個數組中較小保持一致。不要求順序。

我們可以先判斷一下兩個數組是否爲空集,之後給nums1排序,之後枚舉nums2中的元素,假如nums2[i]在nums1中存在,則將此元素加之至返回結果中,並從nums1中刪掉此元素。

爲了優化時間,將nums1排序後可以使用二分查找方法。時間複雜度 m*log(n)。

代碼如下:

class Solution {
public:
    int binaryFind(vector<int> nums, int target) {
        int l = 0, r = nums.size()-1;
        while (l < r) {
            int mid = (l + r) / 2;
            if (nums[mid] == target) 
                return mid;
            if (nums[mid] > target) {
                r = mid - 1;
            }
            else {
                l = mid + 1;
            }
        }
        if (nums[l] == target) return l;
        return -1;
    }
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        if (nums1.empty() || nums2.empty()) return {};
        vector<int>ans;
        sort(nums1.begin(), nums1.end());
        for (int i : nums2) {
            if (nums1.empty()) break;
            int addr = binaryFind(nums1, i);
            if (addr != -1) {
                ans.push_back(i);
                nums1.erase(nums1.begin()+addr);
            }
        }
        return ans;
    }
};

對於所提出的問題:

1. 假如所給的都是排好序的,那麼可以直接用兩個指針,分別從前向後開始枚舉,相同則放入,不同則略過。

2. 假如nums1大小小於nums2的話,,,可以枚舉nums1,對nums2進行二分查找。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章