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

溫馨提示×

溫馨提示×

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

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

C++怎么實現下一個排列

發布時間:2022-03-28 10:45:34 來源:億速云 閱讀:138 作者:iii 欄目:大數據

這篇文章主要介紹“C++怎么實現下一個排列”,在日常操作中,相信很多人在C++怎么實現下一個排列問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C++怎么實現下一個排列”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

Next Permutation 下一個排列

Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.

If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).

The replacement must be in-place and use only constant extra memory.

Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.

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

江城| 安丘市| 周至县| 临沭县| 沅江市| 颍上县| 平谷区| 揭阳市| 宿迁市| 安岳县| 扶余县| 乐亭县| 宝丰县| 德令哈市| 常宁市| 英超| 塔河县| 宁德市| 江永县| 九龙坡区| 无极县| 德安县| 岳阳县| 盈江县| 屯留县| 宁河县| 武威市| 布尔津县| 伊金霍洛旗| 汤原县| 开化县| 司法| 琼结县| 江门市| 阿巴嘎旗| 南漳县| 灵丘县| 梅州市| 肃南| 长子县| 罗平县|