একটি বাইনারি অ্যারে দেওয়া আছে। আমাদের কাজ হলো সেটিতে সর্বোচ্চ কতগুলো সতত ১ থাকতে পারে যদি আমরা সtevilোopot একটি ০ কে ১ এ ফ্লিপ (পরিবর্তন) করতে পারি।
উদাহরণ
ইনপুট: [1,0,1,1,0]
আউটপুট: 4
ব্যাখ্যা: প্রথম ০ কে ১ এ ফ্লিপ করলে আমরা পাই [1,1,1,1,0] যেখানে সর্বোচ্চ ৪টি সতত ১ রয়েছে।
সমাধানের পদ্ধতি (Sliding Window / Two Pointers)
এই সমস্যাটি স্লাইডিং উইন্ডো বা টু পয়েন্টার টেকনিক দিয়ে দক্ষতার সাথে সমাধান করা যায়। ধাপগুলো:
ret = 1,n = nums.size()আরম্ভ করুন।- যদি
n == 0হয়, তবে0রিটার্ন করুন। j = 0(উইন্ডোর শুরু),zero = 0(উইন্ডোতে থাকা শূন্যের সংখ্যা) আরম্ভ করুন।i = 0থেকেn-1পর্যন্ত লুপ চালান:- যদি
nums[i] == 0হয়, তবেzero++করুন। - যদি
zero > 1হয়, তবে উইন্ডোর শুরুjকে ডান দিকে সরান যতক্ষণ নাzero <= 1হয়। এই সময় যদিnums[j] == 0হয়, তবেzero--করুন। ret = max(ret, i - j + 1)আপডেট করুন।
- যদি
retরিটার্ন করুন।
C++ কোড উদাহরণ
#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;
}
};
int main() {
Solution ob;
vector<int> v = {1,0,1,1,1,0,1,1};
cout << (ob.findMaxConsecutiveOnes(v));
return 0;
}
ইনপুট
{1,0,1,1,1,0,1,1}
আউটপুট
6