สมมติว่ามีการกำหนดสตริงของ '0' และ '1' สตริงนั้นจะเพิ่มขึ้นแบบโมโนโทนิกหากประกอบด้วยจำนวน '0' (อาจเป็น 0) ตามด้วยจำนวน '1' (อาจเป็น 0 ด้วย) เรามีสตริง S ของ '0' และ '1' และเราอาจพลิก '0' เป็น '1' หรือ '1' เป็น '0' ค้นหาจำนวนการพลิกขั้นต่ำเพื่อให้ S เสียงเดียวเพิ่มขึ้น ดังนั้นหากอินพุตเป็น "010110" เอาต์พุตจะเป็น 2 เมื่อพลิกเราจะได้ "011111" หรือ "000111"
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
n :=ขนาดของ S ตั้งค่า flipCount :=0, oneCount :=0
-
สำหรับฉันอยู่ในช่วง 0 ถึง n – 1
-
ถ้า S[i] เป็น 0 แล้ว
-
ถ้า oneCount =0 ให้ข้ามไปที่การวนซ้ำถัดไป
-
เพิ่ม flipCount ขึ้น 1
-
-
มิเช่นนั้นให้เพิ่ม oneCount ขึ้น 1
-
ถ้า oneCount
-
-
ส่งคืน flipCount
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int minFlipsMonoIncr(string S) {
int n = S.size();
int flipCount = 0;
int oneCount = 0;
for(int i = 0; i < n; i++){
if(S[i] == '0'){
if(oneCount == 0) continue;
flipCount++;
} else oneCount++;
if(oneCount < flipCount) flipCount = oneCount;
}
return flipCount;
}
};
main(){
Solution ob;
cout << (ob.minFlipsMonoIncr("010110"));
} อินพุต
"010110"
ผลลัพธ์
2