Skip to main content

Next Greater Element III

Problem statement

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 = 12Output: 21

Example 2:

Input: n = 21Output: -1

Constraints:

  • 1 <= n <= 231 - 1

My solution

/**
* @param {number} n
* @return {number}
*/
var nextGreaterElement = function(n) {
const arr = n.toString().split("");
let pivot = -1;

for (let i = arr.length - 1; i > 0; i--) {
if (arr[i - 1] < arr[i]) {
pivot = i - 1
break;
}
}

if (pivot === -1) {
return -1
}

// console.log("pivot", pivot, arr.length - 1)

for (let i = arr.length - 1; i > pivot; i--) {
// console.log("i", i, pivot)
if (arr[i] > arr[pivot]) {
[arr[pivot], arr[i]] = [arr[i], arr[pivot]]
break;
}
}
const left = arr.slice(0, pivot + 1)
// console.log("newNumber", arr)
const right = arr.slice(pivot + 1)
right.reverse()
const newNumber = Number(left.join("") + right.join(""))

return newNumber > Math.pow(2, 31) -1 ? -1 : newNumber;
};