0
0
Lập trình
Admin Team
Admin Teamtechmely

Tìm Trung Vị Của Hai Mảng Sắp Xếp Tăng Dần

Đăng vào 1 tháng trước

• 4 phút đọc

Đề 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:

  1. Chia Nhỏ và Tìm Kiếm: Chia hai mảng thành mảng 1mả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.

  2. 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 ≤ r2l2 ≤ 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:

  1. 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.

Mã Nguồn

Dưới đây là đoạn mã Python để thực hiện điều này:

python Copy
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

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào