下乙個排列 Leetcode

2021-10-02 20:25:16 字數 902 閱讀 7208

實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。

如果不存在下乙個更大的排列,則將數字重新排列成最小的排列(即公升序排列)。

必須原地修改,只允許使用額外常數空間。

以下是一些例子,輸入位於左側列,其相應輸出位於右側列。

1,2,3 → 1,3,2

3,2,1 → 1,2,3

1,1,5 → 1,5,1

思路:題目大意就是找該陣列的所有排列順序中,字典序比給定順序大1的順序,若已是最大字典序,則返回最小字典序

何為最大字典序?就是所有數字降序排列

何為最小字典序?就是所有數字公升序排列

對於特定排序順序,怎樣找下乙個字典序呢?

如下:對於任意字典序,由後向前找到第一對正序對記為(i, j),此時j以及j後的序列是乙個逆序列,想要找下乙個字典序,那麼一定是將i後邊比i大的最小數字與i交換;

如:1,2,5,4,3;第乙個正序對為(2, 5),2與3交換後得:1,3,5,4,2;

此時5,4,2並不是最小字典序,由此序列為降序,直接逆序,得1,3,2,4,5;即為所求序列;

可以看出上述方法共分三步:

由後向前找到第乙個正序對(i, j);

i後比i大的最小數與i交換;

將i後的序列(是降序)逆序(也即改為公升序);

不難發現2,3步可以顛倒順序,且不影響結果

之所以顛倒順序是因為將降序序列改為公升序之後,找比i大的最小數字就是i之後第乙個比i大的數字;

**如下:

class solution 

//cout << i << endl;

for(int j=i, k=nums.size()-1; jnums[i-1])

}return;

}};

LeetCode 下乙個排列

實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3 1,3,2 3,2,1 1,2,3 1...

leetcode 下乙個排列

題目 31.下乙個排列 實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3 1,3,2 3...

LeetCode 下乙個排列(31)

實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3 1,3,2 3,2,1 1,2,3 1...