演算法 LeetCode31 下乙個排列

2021-10-24 04:02:27 字數 1546 閱讀 2954

原題鏈結

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

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

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

以下是一些例子,輸入位於左側列,其相應輸出位於右側列。

1,2,31,3,2

3,2,11,2,3

1,1,51,5,1

核心: 從後往前找相鄰兩個為公升序的元素, 小大

主要思路流程:

從後往前找相鄰元素為公升序的兩個數,a[i],a[j],這時我們要替換的乙個數為a[i],j之後的序列必為降序

尋找要與a[i]替換的另乙個數,即要找到乙個最小的比a[i]大的數,

由於j後面都是降序,從後往前找的第乙個比a[i]大的數就是最小的數,設為a[k]交換a[i]與a[k]的值

此時下標i後面的數都按降序排列,由於是找比當前排列大的最小排列,所以將i後的數變為最小排列即可,做法就是逆置i之後的數。

如果當前排列為最大排列,那麼直接逆置整個排列即為結果。(**中通過前面j是否為0來判斷,若為0,說明未搜尋到相鄰公升序元素)

注意點:

以下兩種**思想相同, 寫法略不同

**1(使用陣列排序函式):

class

solution

}for

(int i = nums.length -

1; i > replace; i--)}

if(top ==0)

else

}}

**2:

class

solution

}//從i之後找到第二個要被替換的數

for(

int q = nums.length -

1; q > i; q--)}

if(j ==0)

else

}//交換陣列指定位置的值

public

void

swap

(int

nums,

int i,

int j)

//逆置指定下標後的元素

public

void

reverse

(int

a,int i,

int j)

}}

演算法 leetcode31 下乙個排列

會就偷著樂,不會就趕緊看看答案學起來,要不然做題幹啥 題目 實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。以下是一些例子,輸入位於左側列,其相應輸出位...

leetcode 31 下乙個排列

實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3 1,3,2 3,2,1 1,2,3 1...

leetCode 31 下乙個排列

思路就是找到可以變大的最低位,進一步說,就是找到,nums pos 滿足,存在q使得,q pos 且 nums pos nums q 同時要注意的是,最終的答案要取q的下界。這是因為要找剛剛好比所給數字大的數字,所以我們要使得pos位,增大的盡量小。class solution else if nu...