Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

Max Consecutive Ones III ใน C ++


สมมติว่าเรามีอาร์เรย์ 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