<p>You are given a <strong>0-indexed</strong> array <code>nums</code> consisting of <code>n</code> positive integers.</p>

<p>The array <code>nums</code> is called <strong>alternating</strong> if:</p>

<ul>
	<li><code>nums[i - 2] == nums[i]</code>, where <code>2 &lt;= i &lt;= n - 1</code>.</li>
	<li><code>nums[i - 1] != nums[i]</code>, where <code>1 &lt;= i &lt;= n - 1</code>.</li>
</ul>

<p>In one <strong>operation</strong>, you can choose an index <code>i</code> and <strong>change</strong> <code>nums[i]</code> into <strong>any</strong> positive integer.</p>

<p>Return <em>the <strong>minimum number of operations</strong> required to make the array alternating</em>.</p>

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

<pre>
<strong>Input:</strong> nums = [3,1,3,2,4,3]
<strong>Output:</strong> 3
<strong>Explanation:</strong>
One way to make the array alternating is by converting it to [3,1,3,<u><strong>1</strong></u>,<u><strong>3</strong></u>,<u><strong>1</strong></u>].
The number of operations required in this case is 3.
It can be proven that it is not possible to make the array alternating in less than 3 operations. 
</pre>

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

<pre>
<strong>Input:</strong> nums = [1,2,2,2,2]
<strong>Output:</strong> 2
<strong>Explanation:</strong>
One way to make the array alternating is by converting it to [1,2,<u><strong>1</strong></u>,2,<u><strong>1</strong></u>].
The number of operations required in this case is 2.
Note that the array cannot be converted to [<u><strong>2</strong></u>,2,2,2,2] because in this case nums[0] == nums[1] which violates the conditions of an alternating array.
</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>1 &lt;= nums[i] &lt;= 10<sup>5</sup></code></li>
</ul>

class Solution:
    def minimumOperations(self, nums: List[int]) -> int:
        '''
        let's say we only care about the requirement nums[i - 2] == nums[i], then we need to get the max freq for both of the odd & even idx inorder to get the result using (total numbers in odd idx - max freq in odd) + (total numbers in even idx - max freq in even) , now bring the second requirement nums[i] != nums[i-1] in and think of what if the number with the max freq is same for both of the even/odd idx ,then we either change the numbers with max freq in odd idx or change the numbers with max freq in even idx and that's why we need to introduce the second max freq for both of the odd&even.
So the result will be
either : (total numbers in odd idx - max freq in odd) + (total numbers in even idx - max freq in even) when the max freq num is not the same in both of the even and odd idx
or : Math.min(total number in odd idx - second max freq in odd + total numbers in even - max freq in even, total numbers in even idx - second freq in even + total numbers in odd idx - max freq in odd);
        '''
        if len(nums) <= 1:
            return 0
            
        odd_freq = Counter(nums[1::2])
        even_freq = Counter(nums[::2])


        odd = [(v,k) for k, v in odd_freq.items()]
        odd.sort()
        even = [(v,k) for k, v in even_freq.items()]
        even.sort()

        # if the last element of the odd is not equal to last element of the even
        # then simply subtract it's freq from the len of the nums
        if odd[-1][1] != even[-1][1]:
            return len(nums) - odd[-1][0] - even[-1][0]
        
        # if have same values in both, then we have 2 scenarios to choose either.
        # 
        # Either choose the 
        cand = len(nums) - odd[-1][0] - (even[-2][0] if len(even)>1 else 0)
        cand1 = len(nums) - even[-1][0] - (odd[-2][0] if len(odd)>1 else 0)
        
        return min(cand, cand1)

        
933