1. 程式人生 > >LeetCode-Next Greater Element III

LeetCode-Next Greater Element III

一、Description

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 n and is greater in value than n. If no such positive 32-bit integer exists, you need to return -1.

題目大意:

給定一個32位的整數n,你需要找到一個大於這個數字的最小的數字x,x具有和n相同的數字,如果不存在這樣的x,返回-1。

Example 1:

Input: 1432
Output: 2134

Example 2:

Input: 520
Output: -1

二、Analyzation

首先要理解題目意思,n和x是具有相同數字的,只不過是重新組合,而且x是比n大的最小的那一種組合。之前是打算通過DFS寫了一個全排列,將n的所有排列形式放進一個List中,然後判斷n是不是在列表的最後一個,如果是就返回-1,否則就返回後面一個排列數,但資料只過了90%,後面的超時,因此就換一種思路。

首先將n變成一個字串形式s,從s的最後一位向前找,找到滿足s[i] > s[i - 1]的第一個i,那麼只需要將下標從i到s.length() - 1中比s[i - 1]大的最小的數字與s[i - 1]換個位置,然後將下標從i到s.length() - 1的序列從小到大排列,再與之前的子串接上即為所求。


三、Accepted code

class Solution {
    public int nextGreaterElement(int n) {
        String s = String.valueOf(n);
        char[] ss = s.toCharArray();
        int i;
        for (i = s.length() - 1; i > 0; i--) {
            if (s.charAt(i) > s.charAt(i - 1)) {
                break;
            }
        }
        if (i == 0) {
            return -1;
        }
        int min = 10, minj = 0;
        for (int j = s.length() - 1; j >= i; j--) {
            if (s.charAt(j) - '0' > s.charAt(i - 1) - '0' && s.charAt(j) - '0' < min) {
                min = s.charAt(j) - '0';
                minj = j;
            }
        }
        char temp = ss[i - 1];
        ss[i - 1] = ss[minj];
        ss[minj] = temp;
        List<Integer> list = new ArrayList<>();
        for (int j = i; j < ss.length; j++) {
            list.add(Integer.parseInt(ss[j] + ""));
        }
        Collections.sort(list);
        String result = "";
        for (int j = 0; j < i; j++) {
            result += ss[j] + "";
        }
        for (int j = 0; j < list.size(); j++) {
            result += list.get(j);
        }
        long val = Long.parseLong(new String(result));
        return (val <= Integer.MAX_VALUE) ? (int)val : -1;
    }
}