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