LeetCode-Next Greater Element III
阿新 • • 發佈:2018-11-01
一、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; } }