Leetcode 31 下乙個排列

2021-10-12 14:08:56 字數 2860 閱讀 9542

題目:

31. 下乙個排列

31. 下乙個排列

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

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

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

示例 1:

輸入:nums = [1,2,3]

輸出:[1,3,2]

示例 2:

輸入:nums = [3,2,1]

輸出:[1,2,3]

示例 3:

輸入:nums = [1,1,5]

輸出:[1,5,1]

示例 4:

輸入:nums = [1]

輸出:[1]

思路

初一看發現可能沒看懂,這個就是找全排列中已知排列的下乙個排列

那麼我們回顧一下全排列

題目:

給定乙個 沒有重複 數字的序列,返回其所有可能的全排列。

示例:輸入: [1,2,3]

輸出:[

[1,2,3],

[1,3,2],

[2,1,3],

[2,3,1],

[3,1,2],

[3,2,1]

]思路:

使用深度優先遍歷,需要注意的是 index這個引數 只不過是統計符合條件的集合數目,並不代表nums中的元素索引下標,我覺得將index改為count這樣的變數名更容易理解。(因為我寫dfs時,習慣用index表示深度)

**:

class

solution

for(

int i=

0;isize()

;i++)}

public

: vector

int>>

permute

(vector<

int>

& nums)

};

nums[1,2,3]通過**形成的樹狀圖是

通過樹狀圖我們知道

【1,2,3】的下乙個排列是【1,3,2】

【2,3,1】的下乙個排列是 【3,1,2】

【3,2,1】的下乙個排列是【1,2,3】

注意: 【3,2,1】的下乙個排列是【1,2,3】(當作特殊化進行處理)

31. 下乙個排列

題目:

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

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

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

思路

通過針對全排列的樹狀圖的分析,我們可以得出,例如1 4 3 2 0 的下乙個排列是 2 0 1 3 4 其實我們從後往前找,找到乙個的不滿足的nums[i]<=num[i+1] 的i ( i位置越界,需要將整個nums反轉後直接返回),我們可以發現 i的位置在 index=0,也就是說i後面的元素是單調不嚴格遞減的【4,3,2,0】。 我們需要明白 此時[i+1,nums.size()-1] 位置中,我們從nums.size()-1==》i+1位置 找到乙個比i位置元素nums[i] 大的元素的位置j

顯然這個位置的元素是 2 index=3; 然後交換兩個元素的值,swap(nums[i],nums[j]) 然後從小到大排序i+1到nums.size()-1的元素的值

我們注意尋找left時,我用了兩種方法,應該都需要掌握

int i=nums.

size()

-1;while

(i>=

1&&nums[i-1]

>=nums[i])if

(i<1)

int left=i-

1;

或者

int i=nums.

size()

-2;while

(i>=

0&&nums[i]

>=nums[i+1]

)if(i<0)

int left=i;

**:

class

solution

// if(i<1)

// // int left=i-1;

int i=nums.

size()

-2;while

(i>=

0&&nums[i]

>=nums[i+1]

)if(i<0)

int left=i;

int j=nums.

size()

-1;while

(left

>=nums[j]

)int right=j;

//肯定存在j,你放心

swap

(nums[left]

,nums[right]);

sort

(nums.

begin()

+left+

1,nums.

end())

;//注意交換後 是i+1,nums.size()-1 進行排序(less<>())}}

;

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