LeetCode-556. 下一個更大元素 III
阿新 • • 發佈:2022-04-07
題目來源
題目詳情
給你一個正整數 n
,請你找出符合條件的最小整數,其由重新排列 n
中存在的每位數字組成,並且其值大於 n
。如果不存在這樣的正整數,則返回 -1
。
注意 ,返回的整數應當是一個 32 位整數 ,如果存在滿足題意的答案,但不是 32 位整數 ,同樣返回 -1
。
示例 1:
輸入: n = 12
輸出: 21
示例 2:
輸入: n = 21
輸出: -1
提示:
1 <= n <= 231 - 1
相似題目
題解分析
解法一:雙指標法
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); } }