0Pricing
DSA Interview Prep · บทเรียน

มัธยฐานของอาร์เรย์เรียงลำดับสองชุด

แก้ปัญหามัธยฐานของอาร์เรย์เรียงลำดับสองชุดในเวลา O(log(min(m,n))) ด้วยการค้นหาแบบทวิภาคบนขอบเขตการแบ่งของอาร์เรย์ที่สั้นกว่า

มัธยฐานของอาร์เรย์เรียงลำดับสองชุด เป็นบทเรียน DSA Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน DSA Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส DSA Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน

มัธยฐานของอาร์เรย์เรียงลำดับสองชุด

มัธยฐานของอาร์เรย์เรียงลำดับสองชุด (LeetCode 4) เป็นปัญหายากคลาสสิก กำหนดอาร์เรย์ที่เรียงลำดับแล้วสองชุด nums1 (ความยาว m) และ nums2 (ความยาว n) ให้ค้นหามัธยฐานของลำดับที่รวมและเรียงลำดับแล้ว โดยใช้เวลา O(log(min(m,n))) วิธีพื้นฐานคือผสานอาร์เรย์ทั้งสองในเวลา O(m+n) แต่คำตอบที่เหมาะสมที่สุดใช้การค้นหาแบบทวิภาคบนขอบเขตจุดแบ่ง นี่เป็นหนึ่งในปัญหายากที่บริษัทเทคโนโลยีชั้นนำมักถามบ่อยที่สุด

# Examples:
nums1 = [1, 3]
nums2 = [2]
# Combined sorted: [1, 2, 3] → median = 2.0

nums1b = [1, 2]
nums2b = [3, 4]
# Combined sorted: [1, 2, 3, 4] → median = (2+3)/2 = 2.5

print('Example 1 median:', 2.0)
print('Example 2 median:', 2.5)
print('Total length:', len(nums1)+len(nums2), 'and', len(nums1b)+len(nums2b))

แนวทางการผสานแบบพื้นฐาน

แนวทางที่ง่ายที่สุดซึ่งใช้เวลา O(m+n): ผสานอาร์เรย์ที่เรียงลำดับแล้วทั้งสองชุด จากนั้นค้นหามัธยฐาน การผสานอาร์เรย์ที่เรียงลำดับแล้วสองชุดใช้เวลา O(m+n) มัธยฐานของอาร์เรย์ความยาว L คือ arr[L//2] หาก L เป็นเลขคี่ หรือ (arr[L//2-1] + arr[L//2]) / 2 หาก L เป็นเลขคู่ วิธีนี้ถูกต้อง แต่ไม่เป็นไปตามข้อกำหนด O(log(min(m,n))) ในการสัมภาษณ์ควรนำเสนอวิธีนี้ก่อนเพื่อสร้างแนวทางตั้งต้น แล้วจึงปรับให้เหมาะสม

def find_median_naive(nums1, nums2):
    # Merge two sorted arrays
    merged = []
    i = j = 0
    while i < len(nums1) and j < len(nums2):
        if nums1[i] <= nums2[j]:
            merged.append(nums1[i]); i += 1
        else:
            merged.append(nums2[j]); j += 1
    merged += nums1[i:] + nums2[j:]
    L = len(merged)
    if L % 2 == 1:
        return float(merged[L // 2])
    return (merged[L//2 - 1] + merged[L//2]) / 2.0

print(find_median_naive([1,3],[2]))    # 2.0
print(find_median_naive([1,2],[3,4]))  # 2.5

แนวคิดเรื่องจุดแบ่ง

ข้อสังเกตสำคัญคือ มัธยฐานจะแบ่งอาร์เรย์รวมออกเป็นสองครึ่งที่มีขนาดเท่ากัน เราต้องหาจุดแบ่งของ nums1 และจุดแบ่งของ nums2 ให้เป็นไปตามเงื่อนไขต่อไปนี้: (1) ครึ่งซ้ายมีจำนวนสมาชิกทั้งหมดเท่ากับครึ่งขวา (2) สมาชิกทุกตัวในครึ่งซ้ายมีค่าน้อยกว่าหรือเท่ากับสมาชิกทุกตัวในครึ่งขวา หากค้นหาจุดแบ่งที่เหมาะสมใน nums1 ด้วยการค้นหาแบบทวิภาค จุดแบ่งใน nums2 จะถูกกำหนดโดยอัตโนมัติจากเงื่อนไขเรื่องความยาวรวม

# Partition concept visualised:
# nums1: [1, 3] | [5, 7]   (partition after index 1)
# nums2: [2, 4] | [6, 8]   (partition after index 1)
# Combined left: [1, 3, 2, 4] = 4 elements
# Combined right: [5, 7, 6, 8] = 4 elements
# Valid if max(left) <= min(right): max(3,4)=4 <= min(5,6)=5 ✓
# Median = (max_left + min_right) / 2 = (4+5)/2 = 4.5

nums1, nums2 = [1,3,5,7], [2,4,6,8]
merged = sorted(nums1+nums2)
print('Merged:', merged)
L = len(merged)
print('Median:', (merged[L//2-1]+merged[L//2])/2 if L%2==0 else merged[L//2])

การค้นหาแบบทวิภาคบนจุดแบ่ง

ใช้การค้นหาแบบทวิภาคกับดัชนีจุดแบ่ง i ของ nums1 (อาร์เรย์ที่สั้นกว่า) ดัชนีจุดแบ่ง j ใน nums2 ถูกกำหนดเป็น j = (m+n+1)//2 - i (เพื่อให้ครึ่งซ้ายมีสมาชิกจำนวน (m+n+1)//2 ตัว) จุดแบ่งจะถูกต้องเมื่อ nums1[i-1] ≤ nums2[j] และ nums2[j-1] ≤ nums1[i] การค้นหาแบบทวิภาคจะปรับค่า i ขึ้นหรือลงเพื่อหาจุดสมดุลนี้

def find_median_sorted_arrays(nums1, nums2):
    # Ensure nums1 is the shorter array
    if len(nums1) > len(nums2):
        return find_median_sorted_arrays(nums2, nums1)
    m, n = len(nums1), len(nums2)
    lo, hi = 0, m
    while lo <= hi:
        i = (lo + hi) // 2    # partition index in nums1
        j = (m + n + 1) // 2 - i  # partition index in nums2
        # Boundary values with sentinels
        max_left1  = float('-inf') if i == 0 else nums1[i-1]
        min_right1 = float('inf')  if i == m else nums1[i]
        max_left2  = float('-inf') if j == 0 else nums2[j-1]
        min_right2 = float('inf')  if j == n else nums2[j]
        if max_left1 <= min_right2 and max_left2 <= min_right1:
            # Found the correct partition
            if (m + n) % 2 == 1:
                return float(max(max_left1, max_left2))
            return (max(max_left1, max_left2) + min(min_right1, min_right2)) / 2.0
        elif max_left1 > min_right2:
            hi = i - 1  # i is too large, move left
        else:
            lo = i + 1  # i is too small, move right
    return 0.0

print(find_median_sorted_arrays([1,3],[2]))     # 2.0
print(find_median_sorted_arrays([1,2],[3,4]))   # 2.5

ติดตามการค้นหาแบบทวิภาค

ติดตาม nums1=[1,3], nums2=[2]: m=2, n=1, total=3, lo=0, hi=2. i=(0+2)//2=1, j=(2+1+1)//2-1=1. max_left1=nums1[0]=1, min_right1=nums1[1]=3, max_left2=nums2[0]=2, min_right2=inf (j=1=n). ตรวจสอบ: 1≤inf และ 2≤3 ✓ ผลรวมเป็นเลขคี่: คืนค่า max(1,2)=2.0 ✓ อัลกอริทึมพบจุดแบ่งตั้งแต่ขั้นตอนแรก เพราะขนาดอาร์เรย์เล็ก

def find_median_traced(nums1, nums2):
    if len(nums1) > len(nums2):
        return find_median_traced(nums2, nums1)
    m, n = len(nums1), len(nums2)
    lo, hi = 0, m
    step = 0
    while lo <= hi:
        step += 1
        i = (lo + hi) // 2
        j = (m + n + 1) // 2 - i
        ml1 = float('-inf') if i==0 else nums1[i-1]
        mr1 = float('inf')  if i==m else nums1[i]
        ml2 = float('-inf') if j==0 else nums2[j-1]
        mr2 = float('inf')  if j==n else nums2[j]
        print(f'Step {step}: i={i},j={j}, ml1={ml1},mr1={mr1},ml2={ml2},mr2={mr2}')
        if ml1<=mr2 and ml2<=mr1:
            if (m+n)%2==1: return float(max(ml1,ml2))
            return (max(ml1,ml2)+min(mr1,mr2))/2.0
        elif ml1>mr2: hi=i-1
        else: lo=i+1
    return 0.0

print(find_median_traced([1,3],[2]))

เหตุผลที่ค้นหาแบบทวิภาคบนอาร์เรย์ที่สั้นกว่า

เราค้นหาแบบทวิภาคบนอาร์เรย์ที่สั้นกว่าเพื่อให้ได้ O(log(min(m,n))) แทนที่จะเป็น O(log(m+n)) จุดแบ่งของอาร์เรย์ที่ยาวกว่าจะถูกกำหนดอย่างสมบูรณ์จากจุดแบ่งของอาร์เรย์ที่สั้นกว่า การสลับอินพุตเมื่อ len(nums1) > len(nums2) ทำให้อาร์เรย์ที่สั้นกว่าเป็นขอบเขตการค้นหาเสมอ เงื่อนไขคงที่คือ เมื่อ j ได้มาจาก i และความยาวรวมแล้ว j จะเป็นดัชนีจุดแบ่งที่ถูกต้องสำหรับ nums2 เสมอ

# Prove j is always valid:
# Total elements in left halves = (m+n+1)//2
# Left from nums1: i elements (0 <= i <= m)
# Left from nums2: j = (m+n+1)//2 - i elements
# j must be in [0, n]:
# j >= 0: i <= (m+n+1)//2 <= (m+n+1)//2 ≤ ... always true for valid lo/hi
# j <= n: i >= (m+n+1)//2 - n = (m-n+1)//2 >= 0 (since m <= n)

m, n = 3, 5  # m <= n
half = (m+n+1)//2
for i in range(m+1):
    j = half - i
    valid = 0 <= j <= n
    print(f'i={i}: j={j}, valid={valid}')

การจัดการความยาวรวมที่เป็นเลขคู่และเลขคี่

เมื่อความยาวรวมเป็นเลขคี่: มัธยฐานคือค่าสูงสุดของครึ่งซ้าย (max(max_left1, max_left2)) เมื่อเป็นเลขคู่: มัธยฐานคือค่าเฉลี่ยของค่าสูงสุดจากครึ่งซ้ายและค่าต่ำสุดจากครึ่งขวา สูตร (m+n+1)//2 สำหรับขนาดครึ่งซ้ายใช้ได้ทั้งสองกรณี สำหรับผลรวมที่เป็นเลขคู่ สูตรนี้ให้ค่า n//2 (โดยมีสมาชิกเพิ่มอีกหนึ่งตัวทางซ้าย) แล้วนำมาเฉลี่ยกับ min_right เพื่อให้ได้มัธยฐานสำหรับกรณีเลขคู่

def median_demo(a, b):
    merged = sorted(a + b)
    L = len(merged)
    expected = merged[L//2] if L%2==1 else (merged[L//2-1]+merged[L//2])/2
    computed = find_median_sorted_arrays(a[:], b[:])
    print(f'a={a}, b={b}: merged={merged}, median={expected}, computed={computed}')
    assert abs(expected - computed) < 1e-9

def find_median_sorted_arrays(nums1, nums2):
    if len(nums1)>len(nums2): return find_median_sorted_arrays(nums2,nums1)
    m,n=len(nums1),len(nums2); lo,hi=0,m
    while lo<=hi:
        i=(lo+hi)//2; j=(m+n+1)//2-i
        ml1=float('-inf') if i==0 else nums1[i-1]; mr1=float('inf') if i==m else nums1[i]
        ml2=float('-inf') if j==0 else nums2[j-1]; mr2=float('inf') if j==n else nums2[j]
        if ml1<=mr2 and ml2<=mr1:
            if (m+n)%2==1: return float(max(ml1,ml2))
            return (max(ml1,ml2)+min(mr1,mr2))/2.0
        elif ml1>mr2: hi=i-1
        else: lo=i+1
    return 0.0

median_demo([1,3],[2])
median_demo([1,2],[3,4])
median_demo([],[1])
median_demo([2],[])  # single array

กรณีขอบ

กรณีขอบที่สำคัญ: (1) อาร์เรย์หนึ่งชุดว่าง — มัธยฐานของอาร์เรย์ที่ไม่ว่าง (2) สมาชิกทั้งหมดของอาร์เรย์หนึ่งชุดมีค่าน้อยกว่าอีกชุด — จุดแบ่งอยู่ที่ปลายด้านหนึ่ง (3) มีสมาชิกซ้ำ — อัลกอริทึมจัดการได้ตามปกติ (4) อาร์เรย์ทั้งสองชุดมีความยาว 1 — เป็นมัธยฐานของสมาชิกสองตัวอย่างง่าย หลังเขียนโค้ดควรทดสอบกรณีเหล่านี้เสมอ ค่าตัวแทนขอบเขต -∞ และ +∞ ช่วยจัดการจุดแบ่งที่ขอบ (i=0 หรือ i=m) ได้อย่างเรียบร้อย

def fmsa(a,b):
    if len(a)>len(b): return fmsa(b,a)
    m,n=len(a),len(b); lo,hi=0,m
    while lo<=hi:
        i=(lo+hi)//2; j=(m+n+1)//2-i
        ml1=float('-inf') if i==0 else a[i-1]; mr1=float('inf') if i==m else a[i]
        ml2=float('-inf') if j==0 else b[j-1]; mr2=float('inf') if j==n else b[j]
        if ml1<=mr2 and ml2<=mr1:
            if (m+n)%2==1: return float(max(ml1,ml2))
            return (max(ml1,ml2)+min(mr1,mr2))/2.0
        elif ml1>mr2: hi=i-1
        else: lo=i+1

# Edge cases
print(fmsa([], [1]))             # 1.0
print(fmsa([2], []))             # 2.0
print(fmsa([1,2], [3,4]))        # 2.5
print(fmsa([3,4], [1,2]))        # 2.5
print(fmsa([1,1,1], [1,1]))      # 1.0 (duplicates)
print(fmsa([10,20,30],[5,15,25,35]))  # 17.5

การขยายแนวคิด: สมาชิกที่น้อยที่สุดลำดับที่ k ในอาร์เรย์สองชุด

ปัญหามัธยฐานสามารถขยายเป็นการค้นหาสมาชิกที่น้อยที่สุดลำดับที่ k จากอาร์เรย์ที่เรียงลำดับแล้วสองชุด ในแต่ละขั้น ให้เปรียบเทียบสมาชิกตำแหน่ง k//2 ของแต่ละอาร์เรย์ ตัดครึ่งที่มีค่าน้อยกว่าออก: สมาชิก k//2 ตัวนั้นมีค่าน้อยกว่าสมาชิกอันดับที่ k ทั้งหมด จึงตัดทิ้งได้ จากนั้นลดค่า k ลง k//2 แล้วเรียกซ้ำ กรณีฐานคืออาร์เรย์หนึ่งชุดว่าง (คืนสมาชิกอันดับที่ k จากอาร์เรย์ที่เหลือ) หรือ k=1 (คืนค่าต่ำสุดจากสมาชิกตัวแรกของทั้งสองอาร์เรย์) เวลา: O(log k) = O(log(m+n))

def kth_smallest(nums1, nums2, k):
    if not nums1: return nums2[k-1]
    if not nums2: return nums1[k-1]
    if k == 1: return min(nums1[0], nums2[0])
    # Compare k//2-th elements
    half = k // 2
    i = min(half, len(nums1)) - 1  # index in nums1
    j = min(half, len(nums2)) - 1  # index in nums2
    if nums1[i] <= nums2[j]:
        # Eliminate first (i+1) elements of nums1
        return kth_smallest(nums1[i+1:], nums2, k - (i+1))
    else:
        return kth_smallest(nums1, nums2[j+1:], k - (j+1))

nums1, nums2 = [1,3,5,7], [2,4,6,8]
for k in range(1, 9):
    print(f'k={k}: {kth_smallest(nums1[:], nums2[:], k)}')

เปรียบเทียบแนวทางทั้งหมด

การเปรียบเทียบขั้นสุดท้าย: การผสานอาร์เรย์: O(m+n) time, ใช้พื้นที่ O(m+n) การค้นหาแบบทวิภาคบนจุดแบ่ง: O(log(min(m,n))) time, ใช้พื้นที่ O(1) การเรียกซ้ำเพื่อหาค่าน้อยที่สุดลำดับที่ k: O(log(m+n)) time, ใช้พื้นที่ O(log k) สำหรับสแต็กการเรียกใช้ฟังก์ชัน วิธีค้นหาแบบทวิภาคบนจุดแบ่งเป็นวิธีที่ผู้สัมภาษณ์คาดหวังสำหรับปัญหานี้ นี่เป็นปัญหา LeetCode ทั่วไปที่อธิบายให้ชัดเจนได้ยากที่สุด — ฝึกตรรกะของจุดแบ่งและการตรวจสอบขอบเขตทั้งสี่จุดจนทำได้โดยอัตโนมัติ

# Performance comparison
import time, random

def merge_median(a, b):
    merged = sorted(a+b)
    L=len(merged)
    return merged[L//2] if L%2==1 else (merged[L//2-1]+merged[L//2])/2

def binary_median(a, b):
    if len(a)>len(b): return binary_median(b,a)
    m,n=len(a),len(b);lo,hi=0,m
    while lo<=hi:
        i=(lo+hi)//2;j=(m+n+1)//2-i
        ml1=float('-inf') if i==0 else a[i-1];mr1=float('inf') if i==m else a[i]
        ml2=float('-inf') if j==0 else b[j-1];mr2=float('inf') if j==n else b[j]
        if ml1<=mr2 and ml2<=mr1:
            if (m+n)%2==1: return float(max(ml1,ml2))
            return (max(ml1,ml2)+min(mr1,mr2))/2.0
        elif ml1>mr2: hi=i-1
        else: lo=i+1

for size in [100, 10000]:
    a = sorted(random.sample(range(size*2), size))
    b = sorted(random.sample(range(size*2), size))
    t1=time.time(); [merge_median(a,b) for _ in range(1000)]; t1=time.time()-t1
    t2=time.time(); [binary_median(a,b) for _ in range(1000)]; t2=time.time()-t2
    print(f'n={size}: merge={t1:.4f}s, binary={t2:.4f}s, speedup={t1/t2:.1f}x')

กลยุทธ์การสื่อสารในการสัมภาษณ์

สำหรับปัญหายากนี้ในการสัมภาษณ์: (1) ระบุแนวทางผสานแบบพื้นฐาน O(m+n) ทันที — แสดงให้เห็นถึงความสามารถ (2) อธิบายเป้าหมาย O(log(min(m,n))) และแนวคิดเรื่องจุดแบ่ง (3) ไล่ตรวจสอบเงื่อนไขไม่แปรเปลี่ยนของจุดแบ่ง: max_left1 ≤ min_right2 และ max_left2 ≤ min_right1 (4) อธิบายการจัดการค่าแทนขอบเขตอย่างชัดเจน (5) ระบุสูตรค่ามัธยฐานสำหรับกรณีจำนวนคี่และจำนวนคู่ (6) ทดสอบด้วยตัวอย่าง 1–2 ตัวอย่าง กรอบการทำงาน 5 ขั้นตอนนี้แสดงให้เห็นถึงการแก้ปัญหาอย่างเป็นระบบ แม้แต่กับปัญหาที่ผู้สมัครไม่กี่คนจะแก้ได้อย่างสมบูรณ์แบบภายใต้ความกดดัน

# Clean final solution for interviews:
def findMedianSortedArrays(nums1, nums2):
    if len(nums1) > len(nums2):
        return findMedianSortedArrays(nums2, nums1)
    m, n = len(nums1), len(nums2)
    lo, hi = 0, m
    while lo <= hi:
        i = (lo + hi) // 2
        j = (m + n + 1) // 2 - i
        max_l1 = nums1[i-1] if i > 0 else float('-inf')
        min_r1 = nums1[i]   if i < m else float('inf')
        max_l2 = nums2[j-1] if j > 0 else float('-inf')
        min_r2 = nums2[j]   if j < n else float('inf')
        if max_l1 <= min_r2 and max_l2 <= min_r1:
            if (m + n) % 2:
                return float(max(max_l1, max_l2))
            return (max(max_l1, max_l2) + min(min_r1, min_r2)) / 2.0
        elif max_l1 > min_r2: hi = i - 1
        else: lo = i + 1
# Time: O(log(min(m,n))), Space: O(1)
print(findMedianSortedArrays([1,3],[2]))    # 2.0
print(findMedianSortedArrays([1,2],[3,4]))  # 2.5

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจแนวคิดจากบทเรียนนี้ในรายวิชาโครงสร้างข้อมูล & อัลกอริทึม — การเตรียมตัวสัมภาษณ์การเขียนโปรแกรม

สรุปบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้ว่า สามารถหาค่ามัธยฐานของอาร์เรย์ที่เรียงลำดับแล้วสองอาร์เรย์ได้ใน O(log(min(m,n))) โดยค้นหาแบบทวิภาคเพื่อหาขอบเขตจุดแบ่งที่ถูกต้องในอาร์เรย์ที่สั้นกว่า จุดแบ่งจะถูกต้องเมื่อ max_left1 ≤ min_right2 และ max_left2 ≤ min_right1 โดยใช้ค่าแทนขอบเขตเพื่อจัดการกรณีที่อยู่ตรงขอบ และ การขยายแนวคิดเป็นการหาค่าน้อยที่สุดลำดับที่ k ใช้วิธีตัดทอนครึ่งหนึ่งแบบเรียกซ้ำใน O(log k) time ขอแสดงความยินดีที่เรียนบทเรียนเรื่องการแบ่งและพิชิตจบแล้ว — ตอนนี้คุณมีชุดเครื่องมือที่ครอบคลุมสำหรับการสัมภาษณ์การเขียนโปรแกรมแล้ว

คำถามที่พบบ่อย

บทเรียน “มัธยฐานของอาร์เรย์เรียงลำดับสองชุด” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “มัธยฐานของอาร์เรย์เรียงลำดับสองชุด” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส DSA Interview Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส DSA Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “มัธยฐานของอาร์เรย์เรียงลำดับสองชุด”

แก้ปัญหามัธยฐานของอาร์เรย์เรียงลำดับสองชุดในเวลา O(log(min(m,n))) ด้วยการค้นหาแบบทวิภาคบนขอบเขตการแบ่งของอาร์เรย์ที่สั้นกว่า คุณปฏิบัติ DSA Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน DSA Interview Prep หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน DSA Interview Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “มัธยฐานของอาร์เรย์เรียงลำดับสองชุด” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน DSA Interview Prep นี้ได้ไหม

ได้ บทเรียน DSA Interview Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. แม่แบบการแบ่งและพิชิต
  2. นับจำนวนคู่กลับลำดับด้วยการเรียงลำดับแบบผสานที่ดัดแปลง
  3. สมาชิกเสียงข้างมาก: การลงคะแนนแบบ Boyer-Moore
  4. มัธยฐานของอาร์เรย์เรียงลำดับสองชุด
← กลับไปที่ DSA Interview Prep