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