實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。
如果不存在下乙個更大的排列,則將數字重新排列成最小的排列(即公升序排列)。
必須原地修改,只允許使用額外常數空間。
以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,
2,3 → 1,3
,23,
2,1 → 1,2
,31,
1,5 → 1,5
,1
字典序的意思是啥?我想了很長時間,說白了就是
把陣列當做乙個數字,重新排序後,要求比初試的數字隻大一點,
從123—》132,而不是直接到213,231,312,321,這樣更大的數字
那麼如果一開始就是最大的數字咋整?
我們需要將數字重新排列成最小的排列,即321–》123
好了題意清楚了我們來想下思路吧。
思路思路
come on baby
出現吧巴拉巴拉小魔仙
那麼若是不存在變大的可能的話,也就是從左到右每個左邊的都比右邊的大,那麼我們排成最小的就好了
若是有變大的可能,那麼我們需要找出最右部分,注意是部分,是乙個範圍內,出現i一直到陣列最後。
這就是我們需要找到的突破點。
我們找的**,如下。
boolean flag=
true
;int pos=0;
for(
int i=
0;i1;i++)}
if(flag)
arrays.
sort
(nums)
;//不存在變大的可能的話
那麼我們做完這一步
是不是單純的把突變的那一塊換掉,然後從pos往後按照從小到大的順序排列就行了??
我告訴你,你想多了
我為嘛知道?
因為我試了。。。。
哈哈哈哈
菜雞了吧
其實還有乙個細節,這個細節就是
我們怎麼能確定pos位置之後的數都比pos-1位置的數小呢?
存在著這麼一種數,它的大小比pos-1的稍微大一點,但是它的右邊都比pos-1小,左邊
都大於pos-1 一直到pos
所以我們需要找到這個數
從此之後就沒有問題啦。
完整**如下:
public
class
m31nextpar}if
(flag)
arrays.
sort
(nums)
;else
else
}swap
(nums, pos2, pos -1)
; arrays.
sort
(nums, pos, nums.length);}
}}private
static
void
swap
(int
nums,
int pos,
int i)
public
static
void
main
(string[
] args)
;nextpermutation
(nums)
;for
(int i : nums)
system.out.
println
(i);
}}
okok,如果你看到這,覺得對你有所幫助的話,關注點下。謝謝老鐵的關注和紅心咯。。。 力扣 31 下乙個排列
實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3 1,3,2 3,2,1 1,2,3 1...
力扣 31 下乙個排列
下乙個排列 整數陣列的乙個 排列 就是將其所有成員以序列或線性順序排列。例如,arr 1,2,3 以下這些都可以視作 arr 的排列 1,2,3 1,3,2 3,1,2 2,3,1 整數陣列的 下乙個排列 是指其整數的下乙個字典序更大的排列。更正式地,如果陣列的所有排列根據其字典順序從小到大排列在乙...
力扣刷題筆記 31 下乙個排列
題目 31.下乙個排列 實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3 1,3,2 3...