leetcode 下乙個排列

2021-10-07 19:40:02 字數 1038 閱讀 8142

題目

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...