leetcode556. Next Greater Element III

題目要求

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.java

Example 1:git

Input: 12
Output: 21code

Example 2:排序

Input: 21
Output: -1it

現有一個32位的正整數,要求找到用該正整數中一樣的數字組成的比該正整數大的最小正整數。
好比現有正整數245,比該正整數大的數字包括425,452,254,542,524, 該方法應當返回254class

思路和代碼

有一個基本的思路咱們知道,若是要找到大於當前數字的最小正整數,咱們應當儘量的保證高位不發生變化,經過交換低位的數字獲得相對而言更大的正整數。遍歷

所以從右往左遍歷,一旦找到一個數字,其值低於已經遍歷過的任何一個值,則能夠將從該值起右側的全部數字的順序進行調整,找到一個大於該子整數的最小正整數。方法

舉個例子:53421,從右往左遍歷能夠3小於其右側的任何一個值,則將3和右側最小的整數進行交換獲得51423,再對1右側的全部數字按照從小到大進行排序,則能夠得出大於53421的最小正整數,即51234next

代碼以下:sort

public int nextGreaterElement(int n) {  
    String value = String.valueOf(n);  
    char[] digits = value.toCharArray();  
    int i = digits.length - 1;  
    //找到小於右側任意值的第一個正整數
    while (i > 0) {  
        if (digits[i - 1] < digits[i]) {  
            break;  
        }  
        i--;  
    }  
    
    if (i == 0) {  
        return -1;  
    }  
  
    //找到該整數右側大於該整數的最小整數
    int maxIndex = i, j = i;  
    while (j < digits.length) {  
        if (digits[j] <= digits[maxIndex] && digits[j] > digits[i-1]) {  
            maxIndex = j;  
        }  
        j++;  
    }  
  
    //交換兩個整數
    char tmp = digits[i-1];  
    digits[i-1] = digits[maxIndex];  
    digits[maxIndex] = tmp;  
  
    //對整數右側的值按照從小到大進行排序
    Arrays.sort(digits, i, digits.length);  
  
    long result = Long.valueOf(String.valueOf(digits));  
    return result < Integer.MAX_VALUE ? (int) result : -1;  
}
相關文章
相關標籤/搜索