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

<p>A partition of an array into one or more <strong>contiguous</strong> subarrays is called <strong>good</strong> if no two subarrays contain the same number.</p>

<p>Return <em>the <strong>total number</strong> of good partitions of </em><code>nums</code>.</p>

<p>Since the answer may be large, return it <strong>modulo</strong> <code>10<sup>9</sup> + 7</code>.</p>

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

<pre>
<strong>Input:</strong> nums = [1,2,3,4]
<strong>Output:</strong> 8
<strong>Explanation:</strong> The 8 possible good partitions are: ([1], [2], [3], [4]), ([1], [2], [3,4]), ([1], [2,3], [4]), ([1], [2,3,4]), ([1,2], [3], [4]), ([1,2], [3,4]), ([1,2,3], [4]), and ([1,2,3,4]).
</pre>

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

<pre>
<strong>Input:</strong> nums = [1,1,1,1]
<strong>Output:</strong> 1
<strong>Explanation:</strong> The only possible good partition is: ([1,1,1,1]).
</pre>

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

<pre>
<strong>Input:</strong> nums = [1,2,1,3]
<strong>Output:</strong> 2
<strong>Explanation:</strong> The 2 possible good partitions are: ([1,2,1], [3]) and ([1,2,1,3]).
</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>9</sup></code></li>
</ul>

mod=10**9+7
def merge(L):
    L.sort(key=lambda x:x[0])
    n=len(L)
    start=L[0][0]
    end=L[0][1]
    ans=[]
    for j in range (0,n):
        if L[j][0]>end:
            ans.append([start,end])
            start=L[j][0]
            end=L[j][1]
        else:
            end=max(end,L[j][1])
        if j==n-1:
            ans.append([start,end])
    return ans
def pow2(n):
    count=1
    L=[1]
    for j in range (0,n):
        count=(count*2)%mod
        L.append(count)
    return L


class Solution:
    def numberOfGoodPartitions(self, L: List[int]) -> int:
        maxi={}
        mini={}
        for j in range (0,len(L)):
            maxi[L[j]]=j
        for j in range (len(L)-1,-1,-1):
            mini[L[j]]=j
        L=[]
        for x in mini:
            L.append([mini[x],maxi[x]])
        L=merge(L)
        M=pow2(len(L))
        return M[len(L)-1]
            
        
849