【題目描述】數組
Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.code
If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).排序
給定一個若干整數的排列,給出按正數大小進行字典序從小到大排序後的下一個排列。get
若是沒有下一個排列,則輸出字典序最小的序列。it
【題目連接】io
www.lintcode.com/en/problem/next-permutation-ii/遍歷
【題目解析】方法
首先找到須要變大的那一位。由於求的是next permutation,因此增大位數要儘可能靠右邊同時增大的數值要儘可能小。具體方法以下:call
1) 從數組尾部開始,依次找每一位數離它最近的比它小的數的位置(即要變大的位置),記錄下這個數和離它最近的比它小的數的index。每一位數獲得的結果都和以前保存的結果作比較,保留index最大的要變大的位置和找到這個位置的數的位置,當要變大的位置相同時,保留數值較小的找到這個位置的數的位置。next
2) 遍歷完整個數組後,根據獲得的結果,將要變大位置的數和找到這個位置的數交換位置,並返回變大的位置
3) 將數組從變大的位置的後一位開始從小到大排序便可。這裏由於要求inplace因此用了bubble sort,若能夠用額外空間還能用更快的排序方法。
【參考答案】