LeetCode 🟡 3011. Find if Array Can Be Sorted
🔗 🟡 3011. Find if Array Can Be Sorted 1497
tags: Biweekly Contest 122
陣列(Array)
模擬(Simulation)
題意
給定一個下標從 開始的正整數陣列 。
在一個操作中,如果兩個 相鄰 元素在二進位下 的個數 相同,那麼可以將這兩個元素交換。可以執行這個操作 任意次(包含 次)。
如果可以排序陣列,返回 ,否則返回 。
約束條件
思路:分組循環 + 維護組內最大值
根據題意,只有相鄰且二進位下 的個數相同的元素可以交換,而若相鄰的某些元素都能交換,則在若干次操作後這些元素都可以互相交換。因此我們可以將陣列中的元素根據它們的二進位表示中 的個數進行分組,對於每一組組內元素,我們可以任意交換相鄰的兩個元素。
在若干次交換後必定可以使得組內元素是有序的,因此我們只需要考慮不同組之間的元素是否是有序的。為此我們需要檢查當前組內的最小值是否大於上一組的最大值,如果是則無法通過交換操作將整個陣列排序。
具體步驟如下:
- 使用一個指標 從左向右遍歷陣列,並初始化變數 為 ,用於記錄前一組的最大值。這裡使用 是因為陣列中的元素均為正整數。
- 對於當前指標 所指向的元素 ,計算它二進位下 的個數 。
- 從 開始,不斷向右移動指標,直到遇到一個二進位下 的個數不等於 的元素為止。這樣可以遍歷完當前元素所在的組。
- 在遍歷該組的過程中,維護該組內的最大值 。同時檢查當前元素是否小於上一組的最大值 ,如果小於則說明無法通過交換操作將整個陣列排序,直接返回 。
- 遍歷完當前組後,更新 為當前組的最大值 ,然後繼續遍歷下一組。
- 如果能夠遍歷完整個陣列且沒有返回 ,則說明可以通過交換操作將整個陣列排序,返回 。
複雜度分析
- 時間複雜度:,其中 是陣列的長度。
- 空間複雜度:。
1 | class Solution: |
1 | class Solution { |
寫在最後
Cover photo is remixed from @吃肥皂泡泡, thanks for their work!
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 十六個天亮!
評論
WalineGiscus