1. 程式人生 > >[LeetCode] Next Greater Element III 下一個較大的元素之三

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

Example 1:

Input: 12
Output: 21

Example 2:

Input: 21
Output: -1

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

解法一:

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,該數字實現的就是這樣一個功能,找下一個全排序,剛好比當前的值大,貼上來權當好玩:

解法二:

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;
    }
};

類似題目:

參考資料: