Given a positive integer n, find the smallest integer which has exactly the same digits existing in the integer
Note that the returned integer should fit in 32-bit integer, if there is a valid answer but it does not fit in 32-bit integer, return
n
and is greater in value than n
. If no such positive integer exists, return -1
.Note that the returned integer should fit in 32-bit integer, if there is a valid answer but it does not fit in 32-bit integer, return
-1
.Example 1:
Input: n = 12 Output: 21
Approach
Java
import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;public class NextGreaterElementIII {public static void main(String[] args) {int n = 12222333;System.out.println(nextGreaterElement(n));}static int nextGreaterElement(int n) {long m = n;int curr = -1;int prev = -1;int[] count = new int[10];// iterate till endwhile (m > 0) {// modecurr = (int) m % 10;// devidem = m / 10;count[curr]++;if (prev > curr) {int num = curr + 1;while (count[num] == 0)num++;count[num]--;m = m * 10 + num;for (int i = 0; i < 10; i++) {while (count[i]-- > 0) {m = m * 10 + i;}}return m > Integer.MAX_VALUE ? -1 : (int) m;}prev = curr;}return -1;}}
C++
#include <bits/stdc++.h>using namespace std;int nextGreaterElement(int n){string str = to_string(n);long long int i = 1;long long int m = str.size();while (i < m && str[i] <= str[i - 1])i++;if (i == m)return -1;long long int j = m - 1;long long int ind = j - 1;while (j > 0 && str[j - 1] >= str[j]){j--;}long long int min1 = str[j - 1];long long int f = 0;long long int max1 = str[j - 1];vector<pair<int, int>> v;for (int i = j; i < m; i++){if (str[i] > max1 && str[i] != min1){v.push_back({str[i], i});ind = i;f = 1;}}sort(v.begin(), v.end());if (f == 0)swap(str[j], str[ind]);elseswap(str[j - 1], str[v[0].second]);string p = str.substr(0, j);string x = str.substr(j);sort(x.begin(), x.end());str = "";str = p + x;//convert string to integerstringstream strr(str);long long int num=0;strr>>num;if (num >= 2147483648)return -1;return num;}int main(){int n = 12;cout << nextGreaterElement(n);return 0;}
No comments:
Post a Comment