<p>Given a binary array <code>nums</code>, you should delete one element from it.</p>

<p>Return <em>the size of the longest non-empty subarray containing only </em><code>1</code><em>&#39;s in the resulting array</em>. Return <code>0</code> if there is no such subarray.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> nums = [1,1,0,1]
<strong>Output:</strong> 3
<strong>Explanation:</strong> After deleting the number in position 2, [1,1,1] contains 3 numbers with value of 1&#39;s.
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> nums = [0,1,1,1,0,1,1,0,1]
<strong>Output:</strong> 5
<strong>Explanation:</strong> After deleting the number in position 4, [0,1,1,1,1,1,0,1] longest subarray with value of 1&#39;s is [1,1,1,1,1].
</pre>

<p><strong class="example">Example 3:</strong></p>

<pre>
<strong>Input:</strong> nums = [1,1,1]
<strong>Output:</strong> 2
<strong>Explanation:</strong> You must delete one element.
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= nums.length &lt;= 10<sup>5</sup></code></li>
	<li><code>nums[i]</code> is either <code>0</code> or <code>1</code>.</li>
</ul>

class Solution {
public:
    int longestSubarray(std::vector<int>& nums) {
        std::vector<std::vector<int>> sequences_length{};
        std::vector<int> tmp{};
        int start = -1;
        
        int i = 0;
        bool flag = 0; //is more then one zero between sequnces of 1
        while ( i < nums.size()){
            switch (nums[i]){
            case 0:
                if (start != -1){
                    tmp.push_back(i - start);
                    start = -1;
                }
                if (flag == 1 && tmp.size() > 0){
                    sequences_length.push_back(tmp);
                    tmp.clear();
                }
                flag = 1;
                break;

            case 1:
                flag = 0;
                if (start == -1){
                    start = i;
                }
                break;
            }
            i++;
        }
        if (start != -1){
            tmp.push_back(i - start);
        }
        if (tmp.size()) {
            sequences_length.push_back(tmp);
        }
        /*
            1. лучшая последовательность это две между которыми один ноль 111101111
            2. весь массив одна последовательность 111111111111
            3. лучшая последовательность между двумя 000111110000
        */
        int max = -1;
        for (const auto &seq : sequences_length){
            if (seq.size() == 1){
                if (seq[0] > max){
                    max = seq[0];
                    if (max == nums.size()){
                        max--;
                    }
                }
            }
            else{
                for (int i = 0; i < seq.size() - 1; i++){
                    int length = seq[i] + seq[i + 1];
                    if (length > max){
                        max = length;
                    }
                }
            }
        }
        if (max == -1){
            max = 0;
        }
        return max;
    }
};
59400