Vui lòng đọc hiểu đề trước khi đọc bài viết này tại đây:
https://leetcode.com/problems/median-of-two-sorted-arrays/description/
Table of Contents
1. Cách tiếp cận vấn đề
Hôm nay chúng ta sẽ cùng nhau giải quyết một bài toán khá thú vị và cũng là một câu hỏi phỏng vấn phổ biến ở các công ty lớn: "Median of Two Sorted Arrays". Đây là một bài toán mức độ "Hard" trên LeetCode, và dĩ nhiên việc tiếp cận nó từng bước một từ cách làm naive nhất, sau đó refactor từng bước để cải thiện time-complexity sẽ giúp chúng ta hiểu rõ được bản chất của vấn đề và cách áp dụng vào những bài toán tương tự.
- Ví dụ 1
- Input: nums1 = [1,3], nums2 = [2]
- Output: 2.00000
- Ví dụ 2
- Input: nums1 = [1,2], nums2 = [3,4]
- Output: 2.50000
- Nếu tổng chiều dài là một số lẻ
- Ví dụ:
- Input: nums1 = [1,3], nums2 = [2]
- Sau khi merge 2 mảng ta được: [1,2,3]
- Giá trị trung vị chính là giá trị ở vị trí = 1 và có giá trị là 2.0
- Nếu tổng chiều dài là một số chẵn
- Ví dụ:
- Input: nums1 = [1,2], nums2 = [3,4]
- Sau khi merge 2 mảng ta được: [1,2,3,4]
- Giá trị trung vị chính là giá trị trung bình cộng của 2 vị trí trung tâm là index 2 và 1 có giá trị là (2 + 3) / 2 = 2.5
2. Solution & Phân Tích
- Tổng số lượng phần tử trong mảng gộp nums ở "phần bên trái" bằng tổng số lượng phần tử ở "phần bên phải".
- Tất cả các phần tử trong mảng gộp nums ở "phần bên trái" đều nhỏ hơn hoặc bằng tất cả các phần tử ở "phần bên phải".
Khi tìm được điểm chia thỏa mãn hai điều kiện trên, số trung vị sẽ được xác định bởi các phần tử lớn nhất ở "phần bên trái" và các phần tử nhỏ nhất ở "phần bên phải".
Cụ thể hơn:
- maxLeftX: phần tử lớn nhất ở phần bên trái của nums1.
- minRightX: phần tử nhỏ nhất ở phần bên phải của nums1.
- maxLeftY: phần tử lớn nhất ở phần bên trái của nums2.
- minRightY: phần tử nhỏ nhất ở phần bên phải của nums2.
=> Chúng ta cần tìm partitionX và partitionY sao cho maxLeftX <= minRightY và maxLeftY <= minRightX.
Giá trị của số trung vị sẽ là:
- max(maxLeftX, maxLeftY) nếu tổng số phần tử là số lẻ
- (max(maxLeftX, maxLeftY) + min(minRightX, minRightY)) / 2 nếu tổng số phần tử là số chẵn
Note: Chúng ta có thể thực hiện tìm kiếm nhị phân trên mảng nhỏ hơn để tối ưu hóa thời gian chạy.
Space-Complexity: O(1). Không sử dụng thêm CTDL lưu trữ nào ngoài một vài biến để lưu các giá trị.