原題鏈結
實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。
如果不存在下乙個更大的排列,則將數字重新排列成最小的排列(即公升序排列)。
必須原地修改,只允許使用額外常數空間。
以下是一些例子,輸入位於左側列,其相應輸出位於右側列。
1,2,3
→1,3,2
3,2,1
→1,2,3
1,1,5
→1,5,1
核心: 從後往前找相鄰兩個為公升序的元素, 小大
主要思路流程:
從後往前找相鄰元素為公升序的兩個數,a[i],a[j]
,這時我們要替換的乙個數為a[i]
,j
之後的序列必為降序
尋找要與a[i]
替換的另乙個數,即要找到乙個最小的比a[i]
大的數,
由於j後面都是降序,從後往前找的第乙個比a[i]
大的數就是最小的數,設為a[k]
交換a[i]
與a[k]
的值
此時下標i
後面的數都按降序排列,由於是找比當前排列大的最小排列,所以將i
後的數變為最小排列即可,做法就是逆置i
之後的數。
如果當前排列為最大排列,那麼直接逆置整個排列即為結果。(**中通過前面j
是否為0來判斷,若為0,說明未搜尋到相鄰公升序元素)
注意點:
以下兩種**思想相同, 寫法略不同
**1(使用陣列排序函式):
class
solution
}for
(int i = nums.length -
1; i > replace; i--)}
if(top ==0)
else
}}
**2:
class
solution
}//從i之後找到第二個要被替換的數
for(
int q = nums.length -
1; q > i; q--)}
if(j ==0)
else
}//交換陣列指定位置的值
public
void
swap
(int
nums,
int i,
int j)
//逆置指定下標後的元素
public
void
reverse
(int
a,int i,
int j)
}}
演算法 leetcode31 下乙個排列
會就偷著樂,不會就趕緊看看答案學起來,要不然做題幹啥 題目 實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。以下是一些例子,輸入位於左側列,其相應輸出位...
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...