Next Greater Element III

Given a positive integer n, find the smallest integer which has exactly the same digits existing in the integer 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 end
        while (m > 0) {
            // mode
            curr = (int) m % 10;
            // devide
            m = 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<intint>> v;
    for (int i = ji < mi++)
    {
        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]);
    else
        swap(str[j - 1]str[v[0].second]);
    string p = str.substr(0j);
    string x = str.substr(j);
    sort(x.begin(), x.end());
    str = "";
    str = p + x;

   //convert string to integer
    stringstream 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