在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
廣告