實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。
如果不存在下乙個更大的排列,則將數字重新排列成最小的排列(即公升序排列)。
必須原地修改,只允許使用額外常數空間。
以下是一些例子,輸入位於左側列,其相應輸出位於右側列。
1,2,3
→1,3,2
3,2,1
→1,2,3
1,1,5
→1,5,1
(1)從後向前遍歷,找到第乙個不滿足降序(不滿足降序可能是相等,比如上面例子中的1,1,5)的元素;若初始序列全部是降序,直接跳轉至(3);
(2)將該元素同它後面的元素中比它大的第乙個元素交換;
(3)將該元素後的所有元素排列,使之成為最小的排列。
public void nextpermutation(int nums)
// 從後向前找到第乙個不滿足遞減的元素
int i = nums.length - 2;
while (i >= 0 && nums[i] >= nums[i + 1])
// 從i+1位置開始,向後查詢比nums[i]大的最小元素 由於之前的第乙個條件可知 後面是遞減的 所以最小元素離最遠
if (i >= 0) // 到達小於nums[i]的時候會退出
swap(nums, i, j - 1); // 交換 j要減1
} // 將i之後的元素逆置(這裡包含一種特殊情況,若該排列已經是字典序中的最大了,則下乙個序列應該是最小字典序,因此,直接在這裡逆置即可)
i++;
int end = nums.length - 1;
while (i < end)
} public void swap(int array, int i, int j)
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...
LeetCode31 下乙個排列
實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3 1,3,2 3,2,1 1,2,3 1...