[LeetCode] Next Greater Element III 下一個較大的元素之三

 

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.html

Example 1:java

Input: 12
Output: 21

 

Example 2:git

Input: 21
Output: -1

 

這道題給了咱們一個數字,讓咱們對各個位數從新排序,求出恰好比給定數字大的一種排序,若是不存在就返回-1。這道題給的例子的數字都比較簡單,咱們來看一個複雜的,好比12443322,這個數字的重排序結果應該爲13222344,若是咱們仔細觀察的話會發現數字變大的緣由是左數第二位的2變成了3,細心的童鞋會更進一步的發現後面的數字由降序變爲了升序,這也不難理解,由於咱們要求恰好比給定數字大的排序方式。那麼咱們再觀察下原數字,看看2是怎麼肯定的,咱們發現,若是從後往前看的話,2是第一個小於其右邊位數的數字,由於若是是個純降序排列的數字,作任何改變都不會使數字變大,直接返回-1。知道了找出轉折點的方法,再來看如何肯定2和誰交換,這裏2並無跟4換位,而是跟3換了,那麼如何肯定的3?其實也是從後往前遍歷,找到第一個大於2的數字交換,而後把轉折點以後的數字按升序排列就是最終的結果了。最後記得爲防止越界要轉爲長整數型,而後根據結果判斷是否要返回-1便可,參見代碼以下:函數

 

解法一:post

class Solution {
public:
    int nextGreaterElement(int n) {
        string str = to_string(n);
        int len = str.size(), i = len - 1;
        for (; i > 0; --i) {
            if (str[i] > str[i - 1]) break;
        }
        if (i == 0) return -1;
        for (int j = len - 1; j >= i; --j) {
            if (str[j] > str[i - 1]) {
                swap(str[j], str[i - 1]);
                break;
            }
        }
        sort(str.begin() + i, str.end());
        long long res = stoll(str);
        return res > INT_MAX ? -1 : res;
    }
};

 

下面這種解法博主感受有些耍賴了,用到了STL的內置函數next_permutation,該數字實現的就是這樣一個功能,找下一個全排序,恰好比當前的值大,貼上來權當好玩:url

 

解法二:spa

class Solution {
public:
    int nextGreaterElement(int n) {
        string str = to_string(n);
        next_permutation(str.begin(), str.end());
        long long res = stoll(str);
        return (res > INT_MAX || res <= n) ? -1 : res;
    }
};

 

相似題目:code

Next Greater Element IIhtm

Next Greater Element I blog

 

參考資料:

https://discuss.leetcode.com/topic/85740/c-4-lines-next_permutation

https://discuss.leetcode.com/topic/86049/simple-java-solution-4ms-with-explanation

 

LeetCode All in One 題目講解彙總(持續更新中...)

相關文章
相關標籤/搜索