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