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

ผลรวมหน้าต่างขนาดคงที่

เลื่อนหน้าต่างความยาว k ใน O(n)

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

ปัญหาผลรวมซ้ำ

งานจำนวนมากต้องหาผลรวมของทุกช่วงที่มีสมาชิกต่อเนื่องกัน k ตัว การคำนวณผลรวมของแต่ละช่วงใหม่ตั้งแต่ต้นเป็นการทำงานที่สิ้นเปลือง และยังมีวิธีที่ดีกว่านั้นครับ 🪟

เริ่มจากวิธีที่ช้า

แนวคิดแบบตรงไปตรงมาคือบวกสมาชิกในแต่ละหน้าต่างที่มีความยาว k แยกกัน วิธีนี้ทำงานซ้ำและมีต้นทุน O(n คูณ k) ซึ่งช้าเกินไปสำหรับข้อมูลขาเข้าขนาดใหญ่

for i in range(n - k + 1):
    s = sum(a[i:i + k])

ข้อสังเกตสำคัญ

หน้าต่างที่อยู่ติดกันมีส่วนที่ ซ้อนทับกัน เกือบทั้งหมด เมื่อเลื่อนไปทางขวาหนึ่งขั้น เพียงนำสมาชิกซ้ายสุดออก แล้วเพิ่มสมาชิกใหม่หนึ่งตัวทางขวา

ตั้งต้นหน้าต่างแรก

เริ่มจากหาผลรวมของสมาชิก k ตัวแรกเพียงครั้งเดียว ผลรวมนี้จะเป็นค่าตั้งต้นที่คุณปรับปรุงต่อไปเมื่อหน้าต่างเลื่อนไปข้างหน้า

window = sum(a[:k])
best = window

เลื่อนหนึ่งขั้น

หากต้องการเลื่อนหน้าต่าง ให้ add สมาชิกที่เข้ามา แล้วลบสมาชิกที่ออกไป วิธีนี้ทำให้การทำงานในแต่ละขั้นใช้เวลาคงที่ O(1)

for i in range(k, n):
    window += a[i] - a[i - k]

ติดตามคำตอบ

หลังจากเลื่อนแต่ละครั้ง ให้อัปเดตค่าที่ต้องการ เช่น ค่าสูงสุดของผลรวมหน้าต่างที่พบจนถึงตอนนี้ ค่าของหน้าต่างจึงพร้อมใช้งานได้ทันทีเสมอ

    best = max(best, window)

ต้นทุนรวมเป็นเชิงเส้น

คุณเข้าถึงสมาชิกแต่ละตัวเพื่อเพิ่มเข้าไปครั้งหนึ่ง และเข้าถึงอีกครั้งเพื่อนำออก ดังนั้นการสแกนทั้งหมดจึงมีความซับซ้อน O(n) และรองรับข้อจำกัดขนาดใหญ่ได้อย่างสบาย

ระวังดัชนี

สมาชิกที่ออกจากหน้าต่างคือ a[i - k] ไม่ใช่ a[i - 1] การใช้ระยะชดเชยให้ถูกต้องเป็นสิ่งที่มักผิดพลาดที่สุดในหน้าต่างความยาวคงที่

หาค่าเฉลี่ยได้โดยง่าย

ต้องการหาค่า เฉลี่ยสูงสุดของหน้าต่างแทนผลรวมหรือไม่ เพียงหารผลรวมของหน้าต่างที่ติดตามไว้ด้วย k ตรรกะการเลื่อนหน้าต่างไม่ต้องเปลี่ยนแปลงเลย

avg = window / k

จัดการอาร์เรย์ขนาดเล็ก

หากอาร์เรย์มีจำนวนสมาชิก น้อยกว่า k จะไม่มีหน้าต่างที่สมบูรณ์ ตรวจสอบ len(a) เทียบกับ k ตั้งแต่ต้น แล้วคืนค่าทันทีเพื่อหลีกเลี่ยงข้อผิดพลาดจากการใช้ดัชนี

if n < k:
    return None

เมื่อใช้หน้าต่างคงที่ได้

ใช้รูปแบบนี้เมื่อหน้าต่างมี ความยาวคงที่ และคุณรวมค่าต่าง ๆ ได้อย่างประหยัด เช่น ผลรวม จำนวน หรือสถิติสะสมอย่างง่าย

ตรวจสอบอย่างรวดเร็ว

คุณเลื่อนหน้าต่างขนาด k ไปทางขวาทีละขั้นผ่านอาร์เรย์

ทบทวน

ตั้งต้นหน้าต่างแรกเพียงครั้งเดียว จากนั้น บวกและลบ ในแต่ละขั้นเพื่อเลื่อนหน้าต่างด้วยเวลา O(1) การสแกนหน้าต่างขนาดคงที่ทั้งหมดจึงใช้เวลาเชิงเส้น ✅

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

บทเรียน “ผลรวมหน้าต่างขนาดคงที่” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “ผลรวมหน้าต่างขนาดคงที่”

เลื่อนหน้าต่างความยาว k ใน O(n) คุณปฏิบัติ Coding Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

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

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

บทเรียน “ผลรวมหน้าต่างขนาดคงที่” ใช้เวลานานแค่ไหน

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

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

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

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

  1. ผลรวมหน้าต่างขนาดคงที่
  2. หน้าต่างแปรผันด้วยตัวชี้สองตัว
  3. สตริงย่อยที่ยาวที่สุดโดยไม่มีตัวซ้ำ
  4. นับหน้าต่างที่เป็นไปตามกฎ
← กลับไปที่ Coding Interview Prep