- 硅谷Python工程師面試指南:數據結構、算法與系統設計
- 任建峰 全書學
- 538字
- 2024-06-27 15:59:33
2.6 實例5:下一個更大排列
將數字重新排列為下一個更大排列。如果無法進行這種排列,則必須將其重新排列為最小排列(即升序排列)。例如(輸入在左列,其相應的輸出在右列):
1,2,3→1,3,2
3,2,1→1,2,3
1,1,5→1,5,1
對于數字排列1,2,3,比當前數字排列更大的下一個排列就是1,3,2。而對于3,2,1,無法找到下一個比當前數字排列更大的排列,因此必須輸出數字排列的升序排列。
思路:首先在數組中從后往前找到一個下降的數字,添加索引為i;然后從后往前找到第一個比當前索引i所在的數值要大的索引j,交換索引位置i以及j的數值;最后,把索引i以后的所有值從小到大排序,如圖2-7~圖2-9所示。

圖2-7 下一個更大排列(1)

圖2-8 下一個更大排列(2)

圖2-9 下一個更大排列(3)
代碼清單2-14 下一個更大排列


復雜度分析:時間復雜度為O(n),空間復雜度為O(1)。
如果現在要求解先前的數字排列,思路正好相反。對于數組nums,首先找到第一個遞增的數,添加索引為p,然后找到第一個比當前nums[p]小的數的索引q,交換這兩個數,最后需要把索引p+1后面的數從大到小排列。
如果面試官讓你求解下一個較大的數值,思路和本題一樣。
當然本題還可以進一步優化,比如利用二分法來尋找比nums[p]大的數的索引q,因為p+1以后的數組都是排好序的。
推薦閱讀
- Java入門經典(第6版)
- 移動UI設計(微課版)
- Learning Laravel 4 Application Development
- MySQL數據庫基礎實例教程(微課版)
- Hands-On Swift 5 Microservices Development
- Spring Boot進階:原理、實戰與面試題分析
- 程序是怎樣跑起來的(第3版)
- OpenMP核心技術指南
- Python自然語言理解:自然語言理解系統開發與應用實戰
- 深入解析Java編譯器:源碼剖析與實例詳解
- 算法秘籍
- 網絡綜合布線與組網實戰指南
- ASP.NET jQuery Cookbook(Second Edition)
- Improving your Penetration Testing Skills
- 生成藝術:Processing視覺創意入門