(已實現)31 下乙個排列 從後向前兩遍掃瞄

2021-10-14 03:04:17 字數 924 閱讀 8498

31. 下乙個排列

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

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

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

示例 1:

輸入:nums =[1

,2,3

]輸出:[1,

3,2]

示例 2:

輸入:nums =[3

,2,1

]輸出:[1,

2,3]

示例 3:

輸入:nums =[1

,1,5

]輸出:[1,

5,1]

示例 4:

輸入:nums =[1

]輸出:[1]

1<= nums.length <=

1000

<= nums[i]

<=

100

從後向前兩遍掃瞄

如果順序為a≥b≥c,那麼需要反轉陣列

否則,找到順序錯誤的地方

演算法

特例:陣列為空或長度小於2均返回原陣列

從後向前查詢,找到nums[i - 1] < nums[i]的 i ,此時[ i, j]一定是降序的

再將[i, j]逆序即可

class

solution

}break;}

i--;}

while

(i < j)

}void

swap

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