<p>Given two positive integers <code>left</code> and <code>right</code>, find the two integers <code>num1</code> and <code>num2</code> such that:</p>

<ul>
	<li><code>left &lt;= num1 &lt; num2 &lt;= right </code>.</li>
	<li><code>num1</code> and <code>num2</code> are both <strong>prime</strong> numbers.</li>
	<li><code>num2 - num1</code> is the <strong>minimum</strong> amongst all other pairs satisfying the above conditions.</li>
</ul>

<p>Return <em>the positive integer array</em> <code>ans = [num1, num2]</code>. <em>If there are multiple pairs satisfying these conditions, return the one with the minimum</em> <code>num1</code> <em>value or</em> <code>[-1, -1]</code> <em>if such numbers do not exist.</em></p>

<p>A number greater than <code>1</code> is called <b>prime</b> if it is only divisible by <code>1</code> and itself.</p>

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

<pre>
<strong>Input:</strong> left = 10, right = 19
<strong>Output:</strong> [11,13]
<strong>Explanation:</strong> The prime numbers between 10 and 19 are 11, 13, 17, and 19.
The closest gap between any pair is 2, which can be achieved by [11,13] or [17,19].
Since 11 is smaller than 17, we return the first pair.
</pre>

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

<pre>
<strong>Input:</strong> left = 4, right = 6
<strong>Output:</strong> [-1,-1]
<strong>Explanation:</strong> There exists only one prime number in the given range, so the conditions cannot be satisfied.
</pre>

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

<ul>
	<li><code>1 &lt;= left &lt;= right &lt;= 10<sup>6</sup></code></li>
</ul>

<p>&nbsp;</p>
<style type="text/css">.spoilerbutton {display:block; border:dashed; padding: 0px 0px; margin:10px 0px; font-size:150%; font-weight: bold; color:#000000; background-color:cyan; outline:0; 
}
.spoiler {overflow:hidden;}
.spoiler > div {-webkit-transition: all 0s ease;-moz-transition: margin 0s ease;-o-transition: all 0s ease;transition: margin 0s ease;}
.spoilerbutton[value="Show Message"] + .spoiler > div {margin-top:-500%;}
.spoilerbutton[value="Hide Message"] + .spoiler {padding:5px;}
</style>

class Solution:
    def closestPrimes(self, left: int, right: int) -> List[int]:
        
        def setPrimes(right):
            primes = [True] * (right+1)
            primes[0]=primes[1]=False

            for i in range(2, int(math.sqrt(right))+1):
                if primes[i]:
                    for j in range(i, right//i+1):
                        if i*j<=right:
                            primes[i*j]=False
                        else:
                            break

            return primes

        primes = setPrimes(right)
        # print(primes)
        pre = -1
        ret = list()

        for i in range(left, right+1):
            if primes[i]:
                
                if len(ret)<2:
                    ret.append(i)
                else:
                    if i-pre<ret[1]-ret[0]:
                        ret = [pre, i]
                pre = i

        if len(ret)<2:
            return [-1, -1]
        return ret


    def closestPrimesTLE(self, left: int, right: int) -> List[int]:
        
        def genPrimes(left, right):
            primes = list()

            for val in range(left, right+1):
                earlyStop = False
                for i in range(2, val//2+1):
                    if val%i==0:
                        earlyStop = True
                        break

                if not earlyStop:
                    primes.append(val)

            return primes

        primes = genPrimes(left, right)

        if len(primes)<2:
            return [-1, -1]

        ret = [primes[0], primes[1]]
        for i in range(2, len(primes)):
            if primes[i]-primes[i-1]<ret[1]-ret[0]:
                ret = [primes[i-1], primes[i]]

        return ret
3201