1. 程式人生 > 其它 >LeetCode-556. 下一個更大元素 III

LeetCode-556. 下一個更大元素 III

題目來源

556. 下一個更大元素 III

題目詳情

給你一個正整數 n ,請你找出符合條件的最小整數,其由重新排列 n中存在的每位數字組成,並且其值大於 n 。如果不存在這樣的正整數,則返回 -1

注意 ,返回的整數應當是一個 32 位整數 ,如果存在滿足題意的答案,但不是 32 位整數 ,同樣返回 -1

示例 1:

輸入: n = 12
輸出: 21

示例 2:

輸入: n = 21
輸出: -1

提示:

  • 1 <= n <= 231 - 1

相似題目

31. 下一個排列
556. 下一個更大元素 III

題解分析

解法一:雙指標法

class Solution {
    public int nextGreaterElement(int n) {
        StringBuilder s = new StringBuilder(String.valueOf(n));
        int len = s.length();
        int i = len - 2;
        // 找到第一個相對靠右的較小值,只有改變這個位置的值才有可能得到下一個更小的排列
        while(i >= 0 && s.charAt(i) >= s.charAt(i+1)){
            i--;
        }
        if(i < 0){
            return -1;
        }
        int j = len - 1;
        // 找到第一個靠右的,大於nums[i]的較大值
        while(j >= 0 && s.charAt(i) >= s.charAt(j)){
            j--;
        }
        // 交換這兩個較小值和較大值
        swap(s, i, j);

        int left = i+1, right = len - 1;
        while(left < right){
            swap(s, left, right);
            left++;
            right--;
        }
        int maxs = Integer.MAX_VALUE;
        long ans = Long.parseLong(s.toString());
        return ans > maxs ? -1 : (int) ans;
    }

    private void swap(StringBuilder sb, int i, int j){
        char temp = sb.charAt(i);
        sb.setCharAt(i, sb.charAt(j));
        sb.setCharAt(j, temp);
    }
}