題目
31. 下乙個排列
實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。
如果不存在下乙個更大的排列,則將數字重新排列成最小的排列(即公升序排列)。
必須原地修改,只允許使用額外常數空間。
以下是一些例子,輸入位於左側列,其相應輸出位於右側列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
思路
原地修改,劃重點,不能全部排列出來 然後排序
那就來回倒騰吧。
要找剛好大於當前元素的排列。如果 已經是最大了。就取最小的那個
第一步:從後向前遍歷,找到逆序對,123465 逆序對就是46嘛,就是遍歷找到後乙個 比前乙個元素大的。小的那個 下標 i
第二步:如果找到了,從後向前遍歷,找第乙個比i大的下標 j,如果沒找到 則已經是最大值了。逆置over
第三步:交換i,j
第四部:逆置i+1後面全部元素 over
**
public
void
nextpermutation
(int
nums)
if(i >=0)
swap
(nums, i , j)
;reverse
(nums,i+1)
;}else
}private
void
reverse
(int
nums,
int start)
}private
void
swap
(int
nums,
int i,
int j)
}
總結
這種題目 需要比較靈活的思路。沒有固定的套路吧。另外 刷演算法 需要頭腦很清晰的時候 不然容易陷入一團亂麻。
LeetCode 下乙個排列
實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3 1,3,2 3,2,1 1,2,3 1...
下乙個排列 Leetcode
實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3 1,3,2 3,2,1 1,2,3 1...
LeetCode 下乙個排列(31)
實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3 1,3,2 3,2,1 1,2,3 1...