力扣31 下乙個排列 加油加油

2021-10-03 19:08:06 字數 1791 閱讀 3259

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

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

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

以下是一些例子,輸入位於左側列,其相應輸出位於右側列。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...