Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

C++ หาจำนวน Subarray ที่มีผลรวมอยู่ในช่วงที่กำหนด


ในบทความนี้ เราจะแก้ปัญหาการหาจำนวน Subarray ที่มีผลรวมอยู่ในช่วงที่กำหนดโดยใช้โปรแกรม C++ เรามีอาร์เรย์ arr[] ของจำนวนเต็มบวก และช่วง {L, R} และเราต้องคำนวณจำนวน Subarray ทั้งหมดที่มีผลรวมในช่วงที่กำหนดจาก L ถึง R นี่คือตัวอย่างง่ายๆ สำหรับปัญหา

Input : arr[] = {1, 4, 6}, L = 3, R = 8 Output : 3 Subarrays คือ {1, 4}, {4}, {6}
Input : arr[] = {2, 3, 5, 8}, L = 4, R = 13 Output : 6 Subarrays คือ {2, 3}, {2, 3, 5}, {3, 5}, {5}, {5, 8}, {8}

วิธีการแก้ปัญหา

เราจะอธิบายสองวิธีในการแก้ปัญหานี้ด้วย C++

วิธี Brute Force

วิธี Brute Force พื้นฐานที่สุดคือคำนวณผลรวมของทุก Subarray แล้วตรวจสอบว่าผลรวมนั้นอยู่ในช่วงที่กำหนดหรือไม่ (แต่วิธีนี้จะใช้เวลามาก เพราะ Time Complexity คือ O(n*n) โดย n คือขนาดอาร์เรย์)

วิธีมีประสิทธิภาพ (Efficient Approach)

เพื่อประหยัดเวลา เราใช้วิธีอีกอย่างที่เรียกว่าวิธีมีประสิทธิภาพ วิธีนี้ใช้เทคนิค Sliding Window (หน้าต่างเลื่อน) ด้วยเทคนิคนี้ เราจะคำนวณผลลัพธ์ได้เร็วขึ้นหรือมีประสิทธิภาพมากขึ้นใน O(n)

ตัวอย่าง

#include <bits/stdc++.h> 
using namespace std; 

int subCount(int *arr, int n, int x){ 
    int start = 0, end = 0, sum = 0, count = 0; 
    while (end < n){ 
        sum = sum + arr[end]; 
        while(start <= end && sum >= x){ 
            sum = sum - arr[start]; 
            start++; 
        } 
        count = count + ((end - start) + 1); 
        end++; 
    } 
    return count; 
} 

int main(){ 
    int arr[] = { 1, 4, 6 }; 
    int n = sizeof(arr) / sizeof(arr[0]); 
    int L = 3; 
    int R = 8; 
    int answer; 
    answer = subCount(arr, n, R) - subCount(arr, n, (L - 1)); 
    cout << answer << "\n"; 
    return 0; 
}

ผลลัพธ์

3

คำอธิบายโค้ด

ในวิธีนี้ เรานับจำนวน Subarray ที่ผลรวมน้อยกว่าขีดจำกัดบนของช่วงที่กำหนด แล้วลบด้วยจำนวน Subarray ที่ผลรวมน้อยกว่าขีดจำกัดล่างของช่วงที่กำหนด โดยใช้ฟังก์ชัน subCount

ฟังก์ชัน SubCount

ฟังก์ชันนี้ใช้เทคนิค Sliding Window สำหรับหาจำนวน Subarray ที่ผลรวมน้อยกว่า x

เริ่มต้นเราเริ่มต้น 'end' และ 'start' ทั้งคู่เป็น 0 ขณะที่เราเดินผ่านอาร์เรย์ เราเก็บผลรวมของสมาชิกจาก start ถึง end หลังจากนั้น ถ้า start เท่ากับ end และผลรวมมากกว่าหรือเท่ากับ x เราเริ่มเลื่อน start และลดผลรวมลงเมื่อเราเอาสมาชิกออกจากผลรวม จนกว่าผลรวมจะน้อยกว่า x หรือ start จะมากกว่า end ตอนนี้เราเพิ่ม Count ด้วยจำนวน Subarray แล้วเพิ่ม Right Border ด้วย 1 หลังจาก Outer Loop จบ เราคืนค่าจำนวน Subarray ทั้งหมด

สรุป

ในบทความนี้ เราแก้ปัญหาการหาจำนวน Subarray ที่มีผลรวมอยู่ในช่วงที่กำหนดใน O(n) Time Complexity โดยใช้เทคนิค Sliding Window เรายังได้เรียนรู้จากโปรแกรม C++ สำหรับปัญหานี้ และวิธีแก้ปัญหา (ทั่วไปและมีประสิทธิภาพ) ซึ่งเราสามารถแก้ปัญหานี้ได้ง่าย สามารถเขียนโปรแกรมเดียวกันในภาษาอื่น เช่น C, Java, Python ฯลฯ