Leetcode # 1940. Longest Common Subsequence Between Sorted Arrays
Problem
https://leetcode.com/problems/longest-common-subsequence-between-sorted-arrays/
Solution 1
Time Complexity: O(sum(len(a) for a in arrays)) * 2 (for array in arrays for n in array + for k in keys)
Space Complexity: O(sum(len(a) for a in arrays))
(The input and output generally do not count towards the space complexity.)
class Solution: def longestCommonSubsequence(self, arrays: List[List[int]]) -> List[int]: nums = Counter() for array in arrays: for n in array: nums[n] += 1 keys = sorted(nums.keys()) ret = [] for k in keys: if nums[k] == len(arrays): ret.append(k) return ret
Solution 2
找到在全部 array 都存在的數 ⇔ 只要有一個 array 不存在該數就將其移除
s = min(len(a) for a in arrays)
m = max(len(a) for a in arrays)
Time Complexity:
O(len(a)) + O(s * (len(a) – 1) * log(m)) = O(len(a) * s * log(m))
Space Complexity: O(1)
(The input and output generally do not count towards the space complexity.)
class Solution: def longestCommonSubsequence(self, arrays: List[List[int]]) -> List[int]: shortest_array, shortest_array_i = arrays[0], 0 for i, a in enumerate(arrays[1:]): if len(a) < len(shortest_array): shortest_array = a shortest_array_i = i + 1 def binary_search(array, target): left, right = 0, len(array) - 1 while left <= right: mid = (left + right) // 2 if array[mid] < target: left = mid + 1 elif array[mid] > target: right = mid - 1 else: return True return False longest_common_subseq = [] for n in shortest_array: n_is_common = True for i, a in enumerate(arrays): if i == shortest_array_i: continue if not binary_search(a, n): n_is_common = False break if n_is_common: longest_common_subseq.append(n) return longest_common_subseq
Last Updated on 2024/06/09 by A1go