雙周賽96。

題目

輸入兩個依非遞減排序的整數陣列nums1和nums2,求兩個陣列中最小的共同整數。若不存在共通的整數,則回傳-1。

若一個整數分別在nums1和nums2中至少出現一次,則稱為共同整數

解法

把nums2轉成集合,可供O(1)查找,再來遍歷nums1中每個數字n,因為nums1已經排序過,所以碰到第一個共通整數一定是最小的,直接回傳。

時間複雜度O(M+N)。空間複雜度O(N),其中M為nums1長度,N為nums2長度。

class Solution:
    def getCommon(self, nums1: List[int], nums2: List[int]) -> int:
        s2=set(nums2)        
        for n in nums1:
            if n in s2:
                return n
            
        return -1

也可以把兩個陣列都轉成集合,使用集合的交集方法找出所有共同整數,再找出其中的最小值。

時間複雜度O(M+N)。空間複雜度O(M+N)。

class Solution:
    def getCommon(self, nums1: List[int], nums2: List[int]) -> int:
        return min(set(nums1)&set(nums2),default=-1)

以上兩種方法都沒有妥善利用到有序的特性,使用雙指針直接遍歷兩陣列,可以不需要額外空間,應是此題的最佳解。

時間複雜度O(M+N)。空間複雜度O(1)。

class Solution:
    def getCommon(self, nums1: List[int], nums2: List[int]) -> int:
        M=len(nums1)
        N=len(nums2)
        i=j=0
        
        while i<M and j<N:
            if nums1[i]==nums2[j]:
                return nums1[i]
            elif nums1[i]<nums2[j]:
                i+=1
            else:
                j+=1
                
        return -1