Computer >> Máy Tính >  >> Lập trình >> C ++

Max liên tiếp II trong C ++

Giả sử chúng ta có một mảng nhị phân; chúng ta phải tìm số 1 liên tiếp lớn nhất trong mảng này nếu chúng ta có thể lật nhiều nhất một 0.

Vì vậy, nếu đầu vào là [1,0,1,1,0], thì đầu ra sẽ là 4 bởi vì nếu chúng ta lật số 0 đầu tiên sẽ nhận được số 1s liên tiếp lớn nhất. Sau khi lật, số giây liên tiếp tối đa là 4.

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • ret:=1, n:=kích thước của nums

  • nếu không n là khác 0 thì -

    • trả về 0

  • j:=0, zero:=0

  • để khởi tạo i:=0, khi i

    • nếu nums [i] bằng 0 thì -

      • (tăng 0 lên 1)

    • while (j <=i and zero> 1), do -

      • nếu nums [j] giống 0 thì -

        • (giảm 0 đi 1)

      • (tăng j lên 1)

    • ret:=tối đa ret và (i - j + 1)

  • trả lại ret

Ví dụ

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

#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));
}

Đầu vào

{1,0,1,1,1,0,1,1}

Đầu ra

6