@@ -9,13 +9,49 @@ def find_common_items(
99 """
1010 Find common items between two arrays.
1111
12- Time Complexity:
13- Space Complexity:
14- Optimal time complexity:
12+ Time Complexity: O(n + m) - Single pass through both sequences
13+ Space Complexity: O(min(n, m)) - Set size bounded by smaller sequence
14+ Optimal Time Complexity: O(n + m) - Cannot do better than linear time
1515 """
16+ # OPTIMIZED IMPLEMENTATION: O(n + m) time complexity
17+ # Previous implementation: O(n × m) due to nested loops with linear search
18+
19+ # Convert second sequence to set for O(1) lookup: O(m) time, O(m) space
20+ second_set = set (second_sequence )
21+
22+ # Find common items using set lookup: O(n) time
23+ common_items = []
24+ for item in first_sequence :
25+ if item in second_set and item not in common_items :
26+ common_items .append (item )
27+
28+ return common_items
29+
30+
31+ # ORIGINAL IMPLEMENTATION (for comparison):
32+ """
33+ def find_common_items(
34+ first_sequence: Sequence[ItemType], second_sequence: Sequence[ItemType]
35+ ) -> List[ItemType]:
1636 common_items: List[ItemType] = []
17- for i in first_sequence :
18- for j in second_sequence :
19- if i == j and i not in common_items :
37+ for i in first_sequence: # O(n) iterations
38+ for j in second_sequence: # O(m) iterations each
39+ if i == j and i not in common_items: # O(k) linear search
2040 common_items.append(i)
2141 return common_items
42+
43+ COMPLEXITY ANALYSIS OF ORIGINAL:
44+ - Outer loop: O(n) iterations through first_sequence
45+ - Inner loop: O(m) iterations through second_sequence
46+ - Linear search: O(k) for 'i not in common_items' check
47+ - Total: O(n × m × k) time complexity in worst case
48+ - Space: O(n) for common_items list
49+
50+ PERFORMANCE ISSUES:
51+ - Quadratic time complexity O(n × m) from nested loops
52+
53+ IMPROVEMENTS MADE:
54+ 1. Reduced from O(n × m × k) to O(n + m) time complexity
55+ 2. Set lookup is O(1) vs nested iteration O(m)
56+ 3. Single pass through first_sequence
57+ """
0 commit comments