31 下乙個排列(中等題)

2021-10-01 11:09:59 字數 971 閱讀 8938

題目描述:

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

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

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

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

1,2,3 → 1,3,2

3,2,1 → 1,2,3

1,1,5 → 1,5,1

class

solution

int i = nums.length-2;

//從倒數第二個數字開始找,比後數小的

while

(i >=

0&& nums[i]

>= nums[i+1]

)if(i >=0)

swap

(nums,i,j)

;//交換這兩個數

}reverse

(nums,i+1)

;//最後將nums[i]之後的數逆序

}private

void

reverse

(int

nums,

int start)

}private

void

swap

(int

nums,

int x,

int y )

}

思路概述:

因為找的是下乙個排列,就是比當前數大的最小的排列。所以我們從末位開始遍歷,找到第乙個小於後置位的數,讓這個數和後置位的比他大的最小值交換,如,原數為 1 5 8 4 7 6 5 3 1,第乙個比後數小的是 4 ,後數比他大的最小的數是 5,交換後變為 1 5 8 5 7 6 4 3 1。同時,原來4位置(現在是5)的后位的數肯定是降序,因為要比當前數大的最小值,所以將後面的數逆序,即可得到「下乙個排列」

LeetCode 31 下乙個排列 中等

31.下乙個排列 中等 實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。示例 1 輸入 nums 1,2,3 輸出 1,3,2 示例 2 輸入 nums...

Leetcode題目31 下乙個排列(中等)

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

陣列降序排列 31 下乙個排列(難度 中等)

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