从新排列数字使其恰好比当前值大 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 --);         }     } }

相关文章
相关标签/搜索