<p>Given a positive integer <code>n</code>, find <em>the smallest integer which has exactly the same digits existing in the integer</em> <code>n</code> <em>and is greater in value than</em> <code>n</code>. If no such positive integer exists, return <code>-1</code>.</p>

<p><strong>Note</strong> that the returned integer should fit in <strong>32-bit integer</strong>, if there is a valid answer but it does not fit in <strong>32-bit integer</strong>, return <code>-1</code>.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>
<pre><strong>Input:</strong> n = 12
<strong>Output:</strong> 21
</pre><p><strong class="example">Example 2:</strong></p>
<pre><strong>Input:</strong> n = 21
<strong>Output:</strong> -1
</pre>
<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= n &lt;= 2<sup>31</sup> - 1</code></li>
</ul>

class Solution:
    def nextGreaterElement(self, n: int) -> int:
        if n < 10:
            return -1

        nums = list(map(int,str(n)))
        r = None
        
        for i in range(len(nums) - 2, -1, -1):
            if nums[i] < nums[i+1]:
                r = (i, nums[i])
                break
        
        if not r:
            return -1

        for i in range(len(nums) - 1, r[0], -1):
            if nums[i] > r[1]:
                nums[i], nums[r[0]] = nums[r[0]], nums[i]
                break
        
        nums[r[0] + 1:] = nums[r[0] + 1:][::-1]
        res = int(''.join(map(str,nums)))
        return res if res <= 2**31 - 1 else -1
16400