難度中等528實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。
如果不存在下乙個更大的排列,則將數字重新排列成最小的排列(即公升序排列)。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
三個變數 i j k,三步
公升序對(i,j),找到第乙個大於i的k交換,逆序j到結束。
字典排序的原理:
下乙個排列意味著,下乙個數比當前的數更大,因此要將後面的大數與前面的小數交換,比如123456更大的數字是123465.
希望下乙個數增加的幅度盡可能的小。因此在盡可能靠右的低位進行交換,越靠前交換最後整個數字越大,因此從後向前查詢。
將乙個盡可能小的大數與前面的小數進行交換。比如123465應該交換54而不是64.因此從後向前遍歷,找到第乙個公升序對(i,j),也就是前面需要交換的小數。
從後向前找到乙個大於小數的大數k,進行交換i和k。
j之後的數字一定為降序,逆置j之後的數字,使其變為公升序。
如果在第三步找不到公升序對,說明原始序列是乙個降序對,那麼直接逆序整個陣列。
**過程
(即:找到整個圖的第乙個凹陷處,用盡可能小的數字去替換掉凹陷處的數字。然後將後面逆序全部改為公升序,更小。)
public
void
nextpermutation
(int
nums)
//從後向前找到公升序對,如果沒有公升序對,那麼說明整個是降序的,就將整個陣列逆序
int i =0;
int j = nums.length-1;
boolean flag =
false
;for
( j = nums.length-
1;j>
0;j--)}
int k = nums.length-1;
//從後向前找第乙個第乙個滿足大於i位置上的數字
if(flag)
k--;}
}else
}public
void
swap
(int
nums,
int i,
int j)
public
void
reverse
(int
nums,
int i,
int j)
}
31 下乙個排列
public void nextpermutation int nums 從後向前找到第乙個不滿足逆序的元素 int i nums.length 2 for i 0 nums i nums i 1 i 注意,這裡有 可以排除含有重複元素的情況 從i 1位置開始,向後查詢比nums i 大的最小元素 ...
31 下乙個排列
實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3 1,3,2 3,2,1 1,2,3 1...
31 下乙個排列
實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3 1,3,2 3,2,1 1,2,3 1...