從新排列數字使其恰好比當前值大 Next Greater Element III

問題:git

Given a positive 32-bit integer n, you need to find the smallest 32-bit integer which has exactly the same digits existing in the integer and is greater in value than n. If no such positive 32-bit integer exists, you need to return -1.spa

Example 1:.net

Input: 12
Output: 21

Example 2:blog

Input: 21
Output: -1

解決:get

【題意】給定一個正的32位整數n,你須要找到最小的32位整數,其整數n中的數字徹底相同,而且數值大於n。 若是不存在這樣的正32位整數,則須要返回-1。it

① 本題實質上能夠轉換爲求當前全排列的下一個排列(Next Permutation)。因此,從後向前掃描,找到第一個降序的位置,而後找到右側第一個大於該位置的值的數,交換這兩個數,而後反轉該位置以後的數,就能夠獲得想要的結果。若是總體都是升序的,就返回-1.io

1  2  7  4  3  1 ----- 找到第一個降序的位置class

1  2  7  4  3  1 ----- 找到其右側開始找第一個大於它的值next

1  3  7  4  2  1 ----- 交換這兩個值di

1  3  1  2  4  7 ----- 由於開頭變了,反轉以後的排列

class Solution {//4ms
    public int nextGreaterElement(int n) {
        String str = String.valueOf(n);
        char[] schar = str.toCharArray();
        int len = schar.length;
        int i;
        for (i = len - 1;i > 0;i --){
            if (schar[i] > schar[i - 1]) break;
        }
        if (i == 0) return -1;
        for (int j = len - 1;j >= i;j --){
            if (schar[j] > schar[i - 1]){
                swap(schar,i - 1,j);
                break;
            }
        }
        reverse(schar,i,schar.length - 1);
        long res = Long.parseLong(String.valueOf(schar));//防止轉換後的結果越界         return res > Integer.MAX_VALUE ? -1 : (int)res;     }     public void swap(char[] schar,int i,int j){         char tmp = schar[i];         schar[i] = schar[j];         schar[j] = tmp;     }     public void reverse(char[] schar,int i,int j){         while (i < j){             swap(schar,i ++,j --);         }     } }

相關文章
相關標籤/搜索