中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++下一個排列問題怎么解決

發布時間:2022-10-22 15:35:00 來源:億速云 閱讀:119 作者:iii 欄目:編程語言

本文小編為大家詳細介紹“C++下一個排列問題怎么解決”,內容詳細,步驟清晰,細節處理妥當,希望這篇“C++下一個排列問題怎么解決”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

下一個排列

1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

這道題讓我們求下一個排列順序,由題目中給的例子可以看出來,如果給定數組是降序,則說明是全排列的最后一種情況,則下一個排列就是最初始情況,可以參見之前的博客 Permutations。再來看下面一個例子,有如下的一個數組

1  2  7  4  3  1

下一個排列為:

1  3  1  2  4  7

那么是如何得到的呢,我們通過觀察原數組可以發現,如果從末尾往前看,數字逐漸變大,到了2時才減小的,然后再從后往前找第一個比2大的數字,是3,那么我們交換2和3,再把此時3后面的所有數字轉置一下即可,步驟如下:

1  2  7  4  3  1

1  2  7  4  3  1

1  3  7  4  2  1

1  3  1  2  4  7

解法一:

class Solution {
public:
    void nextPermutation(vector<int> &num) {
        int i, j, n = num.size();
        for (i = n - 2; i >= 0; --i) {
            if (num[i + 1] > num[i]) {
                for (j = n - 1; j > i; --j) {
                    if (num[j] > num[i]) break;
                }
                swap(num[i], num[j]);
                reverse(num.begin() + i + 1, num.end());
                return;
            }
        }
        reverse(num.begin(), num.end());
    }
};

下面這種寫法更簡潔一些,但是整體思路和上面的解法沒有什么區別,參見代碼如下:

解法二:

class Solution {
public:
    void nextPermutation(vector<int>& nums) {int n = nums.size(), i = n - 2, j = n - 1;
        while (i >= 0 && nums[i] >= nums[i + 1]) --i;
        if (i >= 0) {
            while (nums[j] <= nums[i]) --j;
            swap(nums[i], nums[j]);
        }
        reverse(nums.begin() + i + 1, nums.end());
    }
};

讀到這里,這篇“C++下一個排列問題怎么解決”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

兴仁县| 徐水县| 鞍山市| 苗栗县| 巨鹿县| 洮南市| 来凤县| 中牟县| 玉龙| 花莲县| 高密市| 偃师市| 胶州市| 乌拉特前旗| 石柱| 无锡市| 大余县| 余庆县| 苏尼特左旗| 大埔县| 申扎县| 涞水县| 通化县| 普兰店市| 六安市| 长泰县| 清徐县| 阜平县| 阿瓦提县| 广平县| 柯坪县| 南岸区| 长葛市| 西乌珠穆沁旗| 上杭县| 临漳县| 凤凰县| 松溪县| 岚皋县| 德兴市| 南宁市|