實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。
如果不存在下乙個更大的排列,則將數字重新排列成最小的排列(即公升序排列)。
必須原地修改,只允許使用額外常數空間。
以下是一些例子,輸入位於左側列,其相應輸出位於右側列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
分析
首先,我們來分析題目的要求內容,我們先來理解什麼是下乙個排列,演算法需要給定數字序列排成更大的乙個數字,在給定例子之中,123 是1,2,3,這三個數字之中能給定的最小的數字,所以下乙個是十位和個位上的調換,而321是最大的數字,所以下個更大的排列不存在,變為最小的排列。
給定乙個例子,以12345為例,應該有12345,12354,12435,12453,123534.。。。。。。54321這樣的排列,所以我能只需要從後遍歷,遇到有比前位更大的數字,則將兩數抵換,需要注意的是,我們換了最低的數字後,要將這個數後面的數字按公升序排好,這樣才是下乙個排列,具體**如下:
func
nextpermutation
(nums [
]int
)//先行定義i為前面那個數字,j,k為交換數字和排列交換後的排列公升序
i, j, k :=
len(nums)-2
,len
(nums)-1
,len
(nums)-1
tmp :=
0// 先行找到是否有前數大於後數的情況,並找出最前面的一位數
for i >=
0&& nums[i]
>= nums[j]
if i >=
0// swap a[i], a[k]
tmp = nums[i]
nums[i]
= nums[k]
nums[k]
=tmp
}// 排列
for i, j := j,
len(nums)-1
; i < j; i, j = i+
1, j-
1}
LeetCode第三十一題 下乙個排列
問題簡介 給定乙個陣列,將數字重新排列到字典上的下乙個更大的數字排列,當沒有這種排列方式時,即將陣列公升序排列 舉例 1.給定陣列 1,2,4,3,0 結果陣列 1,3,0,2,4 解釋 可以倒序看給定陣列,在數字4處遇見更小的數值2時,從陣列末尾處向前找打第乙個比2大的數字,即3,交換兩個數字,這...
leetcode第31題下乙個排列
實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3 1,3,2 3,2,1 1,2,3 1...
leetcode 第31題 下乙個排列
實現獲取 下乙個排列 的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須 原地 修改,只允許使用額外常數空間。示例 1 輸入 nums 1,2,3 輸出 1,3,2 示例 2 輸入 nums 3,2,1 輸...