最大化給定二進位制陣列中需要翻轉的 0 的數量,使得兩個 1 之間至少有 K 個 0


二進位制陣列是一種特殊的陣列,只包含數字 0 和 1。在這個問題中,我們給定一個二進位制陣列和整數 K。我們的任務是計算在給定二進位制陣列中可以翻轉為 1 的最大 0 的數量,使得兩個 1 之間至少有 K 個 0。

示例

Input 1: arr[] = { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 },  K = 2
Output 1: yes

解釋

上述陣列中第 3 個和第 6 個索引是唯一有效的索引,可以翻轉它們,以保證兩個 1 之間至少有 2 個零。因此,結果陣列為 {1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0}

Input 2: arr[] = {0, 1, 0, 0, 0, 1}, k = 1
Output 2: 1

解釋

上述陣列中第 3 個索引是唯一有效的翻轉索引。

方法

我們已經看到了上面給定陣列和整數 k 的示例,讓我們來看一下方法 -

這種方法的思路是計算兩個 1 之間的連續零的個數,並檢查是否適合在它們之間將一些零翻轉為一。假設兩個 1 之間有 X 個 0。根據觀察,可以在它們之間翻轉的 0 的數量為 (X-K) / (K+1)。因此,遍歷陣列並記錄每個 1 對之間有多少個連續的 0。然後,將可以翻轉的 0 的數量新增到變數 count 中,這就是所需的答案。

讓我們逐步討論這種方法 -

  • 首先,我們將建立一個函式 `onesCount`,它將給定的陣列 `arr` 和整數 `K` 作為引數,並將所需的整數 `count` 作為返回值。

  • 建立變數 count 和 lastIdx。

  • 將變數 count 初始化為 0,以儲存翻轉的 0 的數量。

  • 將變數 lastIdx 初始化為 (-(K+1)),以儲存陣列中值為 1 的最後一個索引。

  • 使用 for 迴圈遍歷陣列,如果當前元素為 1,則檢查兩個連續的 1 之間是否有足夠的 0 來在其間新增另一個 1。最後,更新值為 1 的最後一個索引的值。

  • 編寫計算陣列最後一段 0 的條件,並將其新增到變數 count 中。

  • 最後,返回最終答案 count。

示例

以下是計算最大化需要翻轉的 0 的數量的 C++ 程式,使得兩個 1 之間至少有 k 個 0。

#include <bits/stdc++.h>
using namespace std; 
// Function to find the count of the maximum number of 0s to be filliped 
int onesCount(int arr[], int n, int k){
   int count = 0; // Stores the count of 1's 
   int lastIdx = -(k + 1); // Stores the last index of value 1 
   
   // Traverse the array using for loop
   for (int i = 0; i < n; i++) { 
      // If the current element is 1
      if (arr[i] == 1) { 
      
         // Verify whether there are enough 0s between two consecutive 1s to add another 1 in between them.
         if (i - lastIdx - 1 >= 2 * (k - 1)) {
            count += (i - lastIdx - 1 - k) / (k + 1);
         } 
         lastIdx = i; // Update the last index of the value 1 of the array
      }
   } 
   
   // condition to include the last section of 0s in the array
   count += (n - lastIdx - 1) / (k + 1);
 
   // Return the answer
   return count;
} 
int main(){
   int arr[] = { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 }; // given array
   int N = sizeof(arr) / sizeof(arr[0]); //getting size of an array
   int K = 2; //given integer 
   
   // Call the function
   int result = onesCount(arr, N, K);    
   cout<< "The count of Maximum filliped of 0's is "<< result ;
   return 0;
}

輸出

The Count of Maximum filliped of 0's is 2

時間和空間複雜度

上述程式碼的時間複雜度為 O(N),因為我們只遍歷一次陣列。其中 N 是給定陣列的大小。

上述程式碼的空間複雜度為 O(1),因為我們沒有使用任何額外的空間。

結論

在本教程中,我們實現了一個程式,用於查詢在給定二進位制陣列中最大化需要翻轉的 0 的數量,使得兩個 1 之間至少有 K 個 0。透過計算兩個 1 之間的連續零,並檢查是否適合在它們之間將一些零翻轉為一,來解決此問題。時間複雜度為 O(N),空間複雜度為 O(1)。其中 N 是字串的大小。

更新於: 2023年7月26日

95 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告