ในบทช่วยสอนนี้ เราจะค้นหาจำนวนศูนย์ที่ต้องพลิกเพื่อให้ได้จำนวนสูงสุดของ 1 ที่ต่อเนื่องกันในอาร์เรย์
เราจะใช้วิธีหน้าต่างบานเลื่อนเพื่อแก้ปัญหา มาดูขั้นตอนการแก้ปัญหากัน
-
เริ่มต้นอาร์เรย์และศูนย์สูงสุดที่จะพลิก
-
เริ่มต้นหน้าต่างเริ่มต้น สิ้นสุดดัชนีพร้อมกับความยาว
-
เก็บอาร์เรย์ย่อยสูงสุดของความยาวและดัชนีเริ่มต้นของ 1 ที่ต่อเนื่องกัน
-
วนซ้ำในอาร์เรย์จนกว่าดัชนีสิ้นสุดจะข้ามความยาวของอาร์เรย์
-
หากจำนวนศูนย์น้อยกว่าจำนวนศูนย์สูงสุด ให้เพิ่มดัชนีสิ้นสุดและจำนวนศูนย์หากค่าปัจจุบันเป็นศูนย์
-
หากจำนวนศูนย์มากกว่าจำนวนศูนย์สูงสุด ให้เพิ่มดัชนีเริ่มต้นและลดจำนวนศูนย์หากค่าปัจจุบันเป็นศูนย์
-
อัปเดตหน้าต่างสูงสุดหากความยาวของหน้าต่างปัจจุบันมากกว่าก่อนหน้า
-
วนซ้ำบนอาร์เรย์และพิมพ์ดัชนีศูนย์โดยใช้ดัชนีเริ่มต้นของหน้าต่าง
ตัวอย่าง
มาดูโค้ดกันเลย
#include <bits/stdc++.h> using namespace std; void zeroesIndexes(int arr[], int maxZeroes, int n) { int start = 0, end = 0; int zeroesCount = 0; int bestWindowCount = 0, bestWindowStartIndex = 0; while (end < n) { if (zeroesCount <= maxZeroes) { if (arr[end] == 0) { zeroesCount++; } end++; } if (zeroesCount > maxZeroes) { if (arr[start] == 0) { zeroesCount--; } start++; } if ((end - start > bestWindowCount) && (zeroesCount <= maxZeroes)) { bestWindowCount = end - start; bestWindowStartIndex = start; } } cout << "The indexes are "; for (int i = 0; i < bestWindowCount; ++i) { if(arr[bestWindowStartIndex + i] == 0) cout << bestWindowStartIndex + i << " "; } } int main() { int arr[] = {1, 0, 0, 1, 1, 0, 1, 0, 1, 1}; int maxZeroes= 2; zeroesIndexes(arr, maxZeroes, 10); return 0; }
ผลลัพธ์
หากคุณเรียกใช้โค้ดด้านบน คุณจะได้ผลลัพธ์ดังต่อไปนี้
The indexes are 5 7
บทสรุป
หากคุณมีข้อสงสัยใดๆ ในบทแนะนำ โปรดระบุในส่วนความคิดเห็น