在C++中查詢使陣列“美麗”所需的最小運算元


在這個問題中,我們得到一個二進位制陣列bin[],它包含n個二進位制值(0和1)。我們的任務是找到使陣列“美麗”所需的最小運算元。

“美麗”陣列是一種特殊的二進位制陣列,它具有交替的0和1模式。

**問題描述** − 我們需要找到使陣列“美麗”所需的最小操作次數。一個操作包括以下步驟:

**步驟1** − 將陣列分成兩半。

**步驟2** − 反轉其中一半。

**步驟3** − 將兩半重新連線。

我們將計算使陣列成為“美麗”陣列所需的總操作次數。

讓我們來看一個例子來理解這個問題:

輸入

bin[] = {1, 0, 1, 0, 0, 1}

輸出

1

解釋

我們將分割陣列,建立一個子陣列bin[4, 5],將其反轉,然後重新連線。

解決方案方法

問題的解決方案基於查詢最小交換次數,這等於連續零的個數。基本情況是:

如果陣列大小為1,則它是一個“美麗”陣列。如果陣列大小為奇數,則它永遠不可能是一個“美麗”陣列。

對於所有偶數長度,我們將檢查連續零或一的總數,這將是需要執行的操作次數。

演算法

初始化 − zeroCount , oneCount, consZero = 0

**步驟1** − if ( n = 1), 返回 0

**步驟2** − if (n%2 != 0), 返回 -1。

**步驟3** − 迴圈 i -> 0 到 n-1。

**步驟3.1** − if bin[i] == bin[i+1] == 0, consZero++。

**步驟4** − if bin[n-1] == bin[0] == 0, consZero++。

**步驟5** − 返回 consZero。

程式演示了我們解決方案的工作原理:

示例

 線上演示

#include <iostream>
using namespace std;
int minOperations(int bin[], int n) {
   if(n == 1)
      return 0;
   if(n%2 != 0)
      return -1;
      int consZero = 0;
   for (int i = 0; i < n; ++i) {
      if (i + 1 < n) {
         if (bin[i] == 0 && bin[i + 1] == 0)
            consZero++;
      }
   }
   if (bin[0] == bin[n - 1] && bin[0] == 0)
      consZero++;
      return consZero;
}
int main() {
   int bin[] = { 1, 0, 1, 0, 0, 1};
   int n = sizeof(bin) / sizeof(bin[0]);
   cout<<"The minimum operations needed to make an Array beautiful is "<<minOperations(bin, n);
   return 0;
}

輸出

The minimum operations needed to make an Array beautiful is 1

更新於:2021年3月12日

518 次瀏覽

開啟您的職業生涯

完成課程獲得認證

開始學習
廣告