LeetCode每日一題 下乙個排列

2021-10-24 06:06:18 字數 1099 閱讀 8017

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

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

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

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

1,2,3 → 1,3,2

3,2,1 → 1,2,3

1,1,5 → 1,5,1

分析

首先,我們來分析題目的要求內容,我們先來理解什麼是下乙個排列,演算法需要給定數字序列排成更大的乙個數字,在給定例子之中,123 是1,2,3,這三個數字之中能給定的最小的數字,所以下乙個是十位和個位上的調換,而321是最大的數字,所以下個更大的排列不存在,變為最小的排列。

給定乙個例子,以12345為例,應該有12345,12354,12435,12453,123534.。。。。。。54321這樣的排列,所以我能只需要從後遍歷,遇到有比前位更大的數字,則將兩數抵換,需要注意的是,我們換了最低的數字後,要將這個數後面的數字按公升序排好,這樣才是下乙個排列,具體**如下:

func

nextpermutation

(nums [

]int

)//先行定義i為前面那個數字,j,k為交換數字和排列交換後的排列公升序

i, j, k :=

len(nums)-2

,len

(nums)-1

,len

(nums)-1

tmp :=

0// 先行找到是否有前數大於後數的情況,並找出最前面的一位數

for i >=

0&& nums[i]

>= nums[j]

if i >=

0// swap a[i], a[k]

tmp = nums[i]

nums[i]

= nums[k]

nums[k]

=tmp

}// 排列

for i, j := j,

len(nums)-1

; i < j; i, j = i+

1, j-

1}

LeetCode第三十一題 下乙個排列

問題簡介 給定乙個陣列,將數字重新排列到字典上的下乙個更大的數字排列,當沒有這種排列方式時,即將陣列公升序排列 舉例 1.給定陣列 1,2,4,3,0 結果陣列 1,3,0,2,4 解釋 可以倒序看給定陣列,在數字4處遇見更小的數值2時,從陣列末尾處向前找打第乙個比2大的數字,即3,交換兩個數字,這...

leetcode第31題下乙個排列

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

leetcode 第31題 下乙個排列

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