leetcode31 下乙個排列

2021-09-21 18:51:31 字數 999 閱讀 8179

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

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

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

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

1,2,31,3,2

3,2,11,2,3

1,1,51,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...