สมมติว่าเรามีสตริงไบนารี เราต้องหาจำนวนการแลกเปลี่ยนขั้นต่ำที่จำเป็นในการจัดกลุ่ม 1 อันทั้งหมดเข้าด้วยกันในตำแหน่งใดก็ได้ในสตริง ดังนั้นหากอินพุตเป็นเหมือน "10101001101" เอาต์พุตจะเป็น 3 วิธีแก้ปัญหาที่เป็นไปได้คือ "00000111111"
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
data :=รายการบิตจากสตริงที่กำหนด
-
ตั้งค่าหนึ่ง :=0, n:=ความยาวของ data array
-
สร้างผลรวมอาร์เรย์ของขนาด n และเติมสิ่งนี้ด้วย 0, set summ[0] :=data[0]
-
หนึ่ง :=หนึ่ง + ข้อมูล[0]
-
สำหรับฉันอยู่ในช่วง 1 ถึง n – 1
-
summ[i] :=summ[i - 1] + data[i]
-
หนึ่ง :=หนึ่ง + data[i]
-
-
ตอบ :=หนึ่ง
-
ซ้าย :=0, ขวา :=หนึ่ง – 1
-
ในขณะที่ขวา
-
ถ้าเหลือ 0 แล้ว temp :=summ[right] ไม่เช่นนั้น temp :=summ[right] –
- รวม[ซ้าย - 1]
-
ans :=ขั้นต่ำของ ans หนึ่ง – temp
-
เพิ่มขวาและซ้าย 1
-
-
กลับมาอีกครั้ง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
class Solution(object): def solve(self, data): data = list(map(int, list(data))) one = 0 n = len(data) summ=[0 for i in range(n)] summ[0] = data[0] one += data[0] for i in range(1,n): summ[i] += summ[i-1]+data[i] one += data[i] ans = one left = 0 right = one-1 while right <n: if left == 0: temp = summ[right] else: temp = summ[right] - summ[left-1] ans = min(ans,one-temp) right+=1 left+=1 return ans ob = Solution() print(ob.solve("10101001101"))
อินพุต
"10101001101"
ผลลัพธ์
3