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

หาสับอาร์เรี่ยาวที่สุดที่มีเลขคี่พอดี k ตัวใน C++

สมมติว่ามีอาร์เรย์ที่มี n องค์ประกอบ ปัญหาคือการหาสับอาร์เรี่ยาวที่สุดที่มีเลขคี่พอดี k ตัว ดังนั้นถ้า A = [2, 3, 4, 11, 4, 12, 7] และ k = 1 ผลลัพธ์จะเป็น 4 สับอาร์เรย์คือ [4, 11, 4, 12]

เราสามารถแก้ได้โดยใช้ Sliding Window (หน้าต่างเลื่อน) งานคือดังนี้:

  • เริ่มต้น max := 0, count := 0 และ start := 0
  • สำหรับ i ในช่วง 0 ถึง n – 1 ทำดังนี้
    • ถ้า arr[i] mod 2 ไม่ใช่ 0 ให้เพิ่ม count ขึ้น 1
    • ขณะที่ count > k และ start <= i ทำดังนี้
      • ถ้า arr[start] mod 2 ไม่ใช่ 0 ให้ลด count ลง 1
      • เพิ่ม start ขึ้น 1
    • ถ้า count = k แล้ว
      • ถ้า max < (i – start + 1) ให้ max := (i – start + 1)
    • คืนค่า max

ตัวอย่าง

#include <iostream> 
using namespace std; 

int oddSubarrayMaxLength(int arr[], int n, int k) {
    int max_len = 0, count = 0, start = 0;
    for (int i = 0; i < n; i++) {
        if (arr[i] % 2 != 0)
            count++;
        while (count > k && start <= i)
            if (arr[start++] % 2 != 0)
                count--;
        if (count == k)
            if (max_len < (i - start + 1))
                max_len = i - start + 1;
    }
    return max_len;
}

int main() {
    int arr[] = {2, 3, 4, 11, 4, 12, 7};
    int n = sizeof(arr) / sizeof(arr[0]);
    int k = 1;
    cout << "Maximum Length is: " << oddSubarrayMaxLength(arr, n, k);
}

ผลลัพธ์

Maximum Length is: 4