Next Greater Element Iv

Solution For Next Greater Element Iv

The Next Greater Element IV problem on leetcode asks us to find the next greater permutation of a given integer. In other words, given a positive integer in the form of a string, we need to find the smallest number greater than it, that can be formed by rearranging its digits.

For example, if the input integer is “1234”, the next greater permutation would be “1243”.

To solve this problem, we can follow the following steps:

  1. Convert the integer given as a string into a list of integers. This will make it easier to manipulate its digits.

  2. Traverse the list from right to left to find the first digit that is smaller than the digit to its right. This digit is known as the pivot. For example, in the integer “1234”, the pivot would be “3” since it is smaller than “4”.

  3. If a pivot is found, then we can iterate over the list again from right to left and find the first digit that is greater than the pivot. This digit will then be swapped with the pivot.

  4. Now we have a new pivot, which is the digit immediately to the right of the old pivot. We can sort all the digits to the right of the new pivot in ascending order to obtain the next greater permutation.

  5. If no pivot is found in step 2, then the given integer is already the largest possible permutation, and we can return the smallest possible permutation, which is formed by sorting its digits in ascending order.

Here’s the Python code that implements the above algorithm:

“`
class Solution:
def nextGreaterElement(self, n: int) -> int:
# convert the integer to a list of digits
digits = list(str(n))

    # find the pivot
    pivot_idx = len(digits) - 2
    while pivot_idx >= 0 and digits[pivot_idx] >= digits[pivot_idx+1]:
        pivot_idx -= 1

    # if no pivot is found, return -1
    if pivot_idx == -1:
        return -1

    # find the next greater digit to the right of the pivot
    for i in range(len(digits)-1, pivot_idx, -1):
        if digits[i] > digits[pivot_idx]:
            digits[i], digits[pivot_idx] = digits[pivot_idx], digits[i]
            break

    # sort the digits to the right of the pivot in ascending order
    left, right = pivot_idx+1, len(digits)-1
    while left < right:
        digits[left], digits[right] = digits[right], digits[left]
        left += 1
        right -= 1

    # convert the list of digits back to an integer and return it
    new_num = int("".join(digits))
    return new_num if new_num < 2**31 else -1

“`

The time complexity of this algorithm is O(n), where n is the number of digits in the input integer. The worst-case space complexity is also O(n), since we are storing the digits in a list.

Step by Step Implementation For Next Greater Element Iv

class Solution {
    public int nextGreaterElement(int n) {
        
        // create a stack to keep track of the next greater element
        Stack stack = new Stack<>();
        
        // create a variable to store the result
        int result = -1;
        
        // loop through the digits of the number
        while (n > 0) {
            
            // pop the top element from the stack if it is less than the current digit
            while (!stack.isEmpty() && stack.peek() < n % 10) {
                stack.pop();
            }
            
            // if the stack is empty, then there is no next greater element
            // for the current digit
            if (stack.isEmpty()) {
                result = -1;
            }
            
            // otherwise, the next greater element is on the top of the stack
            else {
                result = stack.peek();
            }
            
            // push the current digit onto the stack
            stack.push(n % 10);
            
            // move to the next digit
            n /= 10;
        }
        
        // return the result
        return result;
    }
}
Here is one possible Python solution for the Leetcode problem next-greater-element-iv. The output should only consist of exact code with comments and nothing else.

def nextGreaterElement(nums1, nums2):

# create a stack to store the next greater element

stack = []

# create a dictionary to store the index of the next greater element

next_greater = {}

# iterate through the nums2 list in reverse order

for i in range(len(nums2)-1, -1, -1):

# pop off the stack until we find an element that is greater than the current element

while stack and stack[-1] <= nums2[i]:

stack.pop()

# if the stack is empty, then there is no next greater element

if not stack:

next_greater[nums2[i]] = -1

# otherwise, the next greater element is the top element of the stack

else:

next_greater[nums2[i]] = stack[-1]

# push the current element onto the stack

stack.append(nums2[i])

# create a list to store the next greater element of each element in nums1

result = []

# iterate through the nums1 list

for i in range(len(nums1)):

# look up the next greater element in the dictionary and append it to the result list

result.append(next_greater[nums1[i]])

return result
var nextGreaterElement = function(nums1, nums2) {
    var map = {};
    var stack = [];
    for (var i = 0; i < nums2.length; i++) {
        while (stack.length && nums2[i] > stack[stack.length - 1]) {
            map[stack.pop()] = nums2[i];
        }
        stack.push(nums2[i]);
    }
    while (stack.length) {
        map[stack.pop()] = -1;
    }
    var res = [];
    for (var i = 0; i < nums1.length; i++) {
        res.push(map[nums1[i]]);
    }
    return res;
};
class Solution {
public:
    int nextGreaterElement(int n) {
        // convert number to digits in reverse order
        vector digits;
        while (n) {
            digits.push_back(n % 10);
            n /= 10;
        }
        reverse(digits.begin(), digits.end());
        
        // find the first digit that is smaller than the digit to its right
        int i = 0;
        while (i < digits.size() - 1 && digits[i] >= digits[i + 1]) {
            i++;
        }
        
        // if no such digit exists (i.e. the number is in descending order), return -1
        if (i == digits.size() - 1) {
            return -1;
        }
        
        // swap the two digits and reverse the digits to the right of (i + 1)
        int j = i + 1;
        while (j < digits.size() && digits[j] > digits[i]) {
            j++;
        }
        swap(digits[i], digits[j - 1]);
        reverse(digits.begin() + i + 1, digits.end());
        
        // convert the vector back to an integer
        long res = 0;
        for (int d : digits) {
            res = res * 10 + d;
        }
        return res > INT_MAX ? -1 : res;
    }
};
public class Solution {
    public int NextGreaterElement(int n) {
        // convert int to char array
        var digits = n.ToString().ToCharArray();
        
        // find the first digit that is smaller than the digit to its right
        int i;
        for (i = digits.Length - 2; i >= 0 && digits[i] >= digits[i + 1]; i--) { }
        
        // if no such digit exists, the number is in descending order and there is no next greater number
        if (i < 0) {
            return -1;
        }
        
        // find the next smallest digit to the right of (i - 1)'th digit
        int j;
        for (j = digits.Length - 1; j > i && digits[j] <= digits[i]; j--) { }
        
        // swap (i - 1)'th and (j)'th digits
        var temp = digits[i];
        digits[i] = digits[j];
        digits[j] = temp;
        
        // reverse the digits to the right of (i - 1)'th digit
        Array.Reverse(digits, i + 1, digits.Length - i - 1);
        
        // convert the char array back to int
        long result = 0;
        foreach (var d in digits) {
            result = result * 10 + (d - '0');
        }
        
        // return -1 if the result is larger than int.MaxValue
        return result > int.MaxValue ? -1 : (int)result;
    }
}


Scroll to Top
[gravityforms id="5" description="false" titla="false" ajax="true"]