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

สลับขั้นต่ำเพื่อแบ่งพาร์ติชั่นอาร์เรย์ไบนารีเพื่อให้มี 0 วินาทีแรกแล้ว 1 วินาทีใน C ++


คำชี้แจงปัญหา

กำหนดอาร์เรย์ของจำนวนเต็ม n ที่มีเพียง 0 และ 1 ค้นหาการสลับขั้นต่ำ (สวิตช์จาก 0 เป็น 1 หรือในทางกลับกัน) ที่จำเป็นเพื่อให้อาร์เรย์นั้นถูกแบ่งพาร์ติชั่น กล่าวคือ มี 0 วินาทีแรกแล้ว 1 วินาที

ตัวอย่าง

หาก arr[] ={1, 0, 0, 1, 1, 1, 0} จำเป็นต้องมีการสลับ 2 ครั้ง เช่น สลับอันแรกและศูนย์สุดท้าย

อัลกอริทึม

  • หากเราสังเกตคำถาม เราจะพบว่ามีจุดตั้งแต่ 0 ถึง n-1 โดยที่องค์ประกอบทั้งหมดที่เหลือจากจุดนั้นควรมี 0 ทั้งหมด และจากขวาไปจุดควรมี 1 ทั้งหมด
  • ดัชนีที่ไม่ปฏิบัติตามกฎหมายนี้จะต้องถูกลบออก แนวคิดคือการนับ 0 ทั้งหมดจากซ้ายไปขวา

ตัวอย่าง

#include <bits/stdc++.h>
using namespace std;
int getMinToggles(int *arr, int n) {
   int zeroCnt[n + 1] = {0};
   for (int i = 1; i <= n; ++i) {
      if (arr[i - 1] == 0) {
         zeroCnt[i] = zeroCnt[i - 1] + 1;
      } else {
         zeroCnt[i] = zeroCnt[i - 1];
      }
   }
   int result = n;
   for (int i = 1; i <= n; ++i) {
      result = min(result, i - zeroCnt[i] + zeroCnt[n] - zeroCnt[i]);
   }
   return result;
}
int main() {
   int arr[] = {1, 0, 0, 1, 1, 1, 0};
   int n = sizeof(arr) / sizeof(arr[0]);
   cout << "Minimum toggles = " << getMinToggles(arr, n) << endl;
   return 0;
}

เมื่อคุณคอมไพล์และรันโปรแกรมข้างต้น มันสร้างผลลัพธ์ต่อไปนี้ -

ผลลัพธ์

Minimum toggles = 2