สมมติว่าเรามีอาร์เรย์จำนวนเต็มหนึ่งชุดที่เรียกว่า nums และประกอบด้วย 0s และ 1s สมมติว่าเรามีการดำเนินการที่เราเลือกดัชนี i เป็น nums และพลิกองค์ประกอบที่ดัชนี i รวมทั้งตัวเลขทั้งหมดทางด้านขวาของ i เราต้องหาจำนวนขั้นต่ำของการดำเนินการที่จำเป็นเพื่อให้ nums มีทั้งหมด 0s
ดังนั้น หากอินพุตเป็น [1,0,1] เอาต์พุตจะเป็น 3 การดำเนินการกับดัชนี 0 มันจะแปลง [0,1,0] จากนั้นในดัชนี 1 [ 0,0,1] จากนั้นดัชนี 2, [0,0,0].
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
n :=ขนาดของ nums
-
กำหนดอาร์เรย์ขนาด n
-
ยกเลิก :=0
-
สำหรับการเริ่มต้น i :=0 เมื่อ i <ขนาดของ nums ให้อัปเดต (เพิ่ม i ขึ้น 1) ให้ทำ -
-
ถ้า i - 1>=0 แล้ว −
-
op[i] :=op[i] + op[i - 1]
-
-
ถ้า (nums[i] + op[i]) &1 ไม่ใช่ศูนย์ ดังนั้น −
-
(เพิ่ม op[i] ขึ้น 1)
-
(เพิ่มการถอยกลับโดย 1)
-
-
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; class Solution { public: int solve(vector<int>& nums) { int n = nums.size(); vector<int> op(n); int ret = 0; for (int i = 0; i < nums.size(); i++) { if (i - 1 >= 0) { op[i] += op[i - 1]; } if ((nums[i] + op[i]) & 1) { op[i]++; ret++; } } return ret; } }; main() { Solution ob; vector<int> v = {1,0,1}; cout << (ob.solve(v)); }
อินพุต
{1,0,1}
ผลลัพธ์
3