leetcode : Next Permutation
runtime 0 ms, beats 100% of cpp submissions
O(n) solution with explanation
tags: none
🔗 link
📖 description
給定一個陣列,回傳他的 next permutation ,如果已經是遞減排序,輸出的遞增排序。
ex. 1 2 3 -> 1 3 2 3 2 1 -> 1 2 3 (遞減排序 -> 遞增排序) 1 1 5 -> 1 5 1
🧠 solution
單純跟 c++ 的 next permutation 一樣,主要的邏輯是
- 先從尾巴往前找到第一個大於下一個元素的位置,表示可以互換
- (ex. 2 5 1 發生了) 5>2
- 如果找到底了都沒有代表此陣列是遞減排序,回傳遞增排序的結果
- 3 2 1 -> 1 2 3 (遞減排序 -> 遞增排序)
- 從尾巴找過的地方挑一個最大的值出來,並與之前挑出來的位置互換
- (ex. 2 5 1 -> 5 2 1) 把 5 跟 2 互換
- 把互換位置後面的 sort 一次元素,讓後方的順序保持最小
- (ex. 5 2 1 -> 5 1 2) 把 2 1 排序成 1 2
⏳ time complexity
遍歷一次元素複雜度 O(n) , sort 後面的元素時間複雜度 O(nlog(n))
總時間複雜度 O(nlog(n))
📝 code
1 | class Solution { |