class Solution:
    def nextGreaterElement(self, n: int) -> int:
        # time O(NlgN) worst 2N,  space O(N), where N is # digits ?
        # notice, 32bit max interger is 2^31 -1 
        # step1,  reverse digits, find target number with, idx smaller than lower digit
        # step2, reverve its lower digit then loop to lower digit until find the smallest number bigger than target number,mark as smallest 
        # step3, swap smallest number and target number
        # step4,  start from target_idx-1, to  idx =0 sort to make sure lower index has larger number 
        # step5, reverse list and convert into string, compare with max 32 bit number 
        if n < 10:
            return -1
        s = list(str(n)[::-1])
        size = len(s)
        smallest = None
        for i in range(size-1):
            if s[i+1] <s[i]:
                print('i',i)
                smallest = s[i]
                small_idx = i
                idx = i+1
                break
        if not smallest:
            return -1
    
        for j in range(small_idx+1):
            if smallest > s[j] and s[j] > s[idx]:
                smallest = s[j]
                small_idx = j
        s[idx],s[small_idx] = s[small_idx],s[idx]
        s[:idx] = sorted(s[:idx],reverse=True)
        res = int(''.join(s[::-1])) 
        if res > 2**31-1:
            return -1
        else:
            return res