Đề Bài
Cho hai mảng đã được sắp xếp theo thứ tự tăng dần, nhiệm vụ của bạn là tìm trung vị (median) của hai mảng này.
Hướng Dẫn Giải Quyết Vấn Đề
Để giải quyết bài toán tìm trung vị của hai mảng, chúng ta sẽ thực hiện theo các bước sau:
-
Chia Nhỏ và Tìm Kiếm: Chia hai mảng thành
mảng 1
vàmảng 2
, sau đó thực hiện tìm kiếm nhị phân (binary search) trên mảng nhỏ hơn để tối ưu hóa thời gian chạy. -
Kiểm Tra Điều Kiện: Sử dụng công thức sau để đảm bảo rằng các phần tử nằm bên trái mảng đã chọn sẽ nhỏ hơn phần tử bên phải:
l1 ≤ r2
vàl2 ≤ r1
, trong đó:l1
: Phần tử lớn nhất bên trái của mảng 1.r1
: Phần tử nhỏ nhất bên phải của mảng 1.l2
: Phần tử lớn nhất bên trái của mảng 2.r2
: Phần tử nhỏ nhất bên phải của mảng 2.
Kết Quả Tính Toán:
- Tính Giá Trị Trung Vị:
- Nếu tổng số phần tử là lẻ, trung vị là phần tử lớn nhất ở nửa bên trái:
max(l1, l2)
. - Nếu tổng số phần tử là chẵn, trung vị sẽ được tính bằng trung bình cộng của hai phần tử ở giữa:
(max(l1, l2) + min(r1, r2)) / 2
.
- Nếu tổng số phần tử là lẻ, trung vị là phần tử lớn nhất ở nửa bên trái:
Mã Nguồn
Dưới đây là đoạn mã Python để thực hiện điều này:
python
class Solution:
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
len1 = len(nums1) # Độ dài mảng 1
len2 = len(nums2) # Độ dài mảng 2
if len1 > len2:
return self.findMedianSortedArrays(nums2, nums1)
total_len = len1 + len2
mid = (len1 + len2 + 1) // 2
low = 0
high = len1
while low <= high:
mid1 = (low + high) // 2 # Chỉ số giữa của mảng 1
mid2 = mid - mid1 # Chỉ số giữa của mảng 2
l1 = float('-inf')
l2 = float('-inf')
r1 = float('inf')
r2 = float('inf')
if mid1 < len1:
r1 = nums1[mid1]
if mid2 < len2:
r2 = nums2[mid2]
if mid1 - 1 > -1:
l1 = nums1[mid1-1]
if mid2 - 1 > -1:
l2 = nums2[mid2-1]
if l1 <= r2 and l2 <= r1:
if total_len % 2 == 1:
return max(l1, l2)
return (max(l1, l2) + min(r1, r2)) / 2
elif l1 > r2:
high = mid1 - 1
else:
low = mid1 + 1
return 0.0
Bằng phương pháp này, bạn có thể dễ dàng tìm ra trung vị của hai mảng đã được sắp xếp mà không cần kết hợp chúng lại với nhau, giúp tiết kiệm thời gian và công sức.
source: viblo