一道看上去很嚇人的演算法面試題:如何對n個數進行排序,要求時間複雜度O(n),空間複雜度O(1)
看上去似乎任何已知的演算法都無法做到,如果誰做到了,那麼所有的排序方法:QuickSort,ShellSort,HeapSort,BubbleSort等等等等,都可以扔掉了,還要這些演算法幹嗎阿,呵呵。不過實際上,在數字範圍有限制的情況下,是有一個這樣的演算法的,只需要用一個陣列記錄每個數字出現次數就可以了。
假定你的數字範圍在0到65535範圍之內,定義一個陣列count[65536](這個空間是常量,和n無關,所以是O(1) ),初值全部為0。
那麼假設有下面這些數字:
100
200
300
119
0
6
...
那麼對於每個這個數字,都做在count中記錄一下:
100 => count[100]++
200 => count[200]++
300 => count[300]++
119 => count[119]++
0 => count[0]++
6 => count[6]++
...
最後,遍歷一邊所有這些數字就可得到0~65535每個數字的個數(在count陣列中),然後再順序遍歷count陣列,count[n] = m,則輸出m個n,(比如說有count[3] = 2, 那麼說明有2個數字3),依次輸出,最後可得結果。第一次遍歷是O(n),第二次遍歷是O(1),為常量,所以最後的時間複雜度為O(n),而空間複雜度為O(1)
這個演算法很簡單,相信大家都會,只是這個題太過於變態了,一般會把面試者嚇住(我原來面試也出過這個題,只不過題目的表述形式要“友善”的多,呵呵)
相關文章
- 時間複雜度O(n)和空間複雜度時間複雜度
- 時間複雜度O(1)、O(n)、O(n²)、O(nlogn)的含義時間複雜度
- 時間複雜度為 O (n^2) 的排序演算法時間複雜度排序演算法
- 時間複雜度為 O(n^2) 的排序演算法時間複雜度排序演算法
- Java實現:排序演算法--時間複雜度為O(n² )Java排序演算法時間複雜度
- 如何不用演算法對陣列進行(0時間複雜度,0空間複雜度)排序?演算法陣列時間複雜度排序
- Leetcode 234. 迴文連結串列 快慢指標+連結串列逆序實現O(n)時間複雜度且O(1)空間複雜度LeetCode指標時間複雜度
- 時間複雜度為 O(nlogn) 的排序演算法時間複雜度排序演算法
- 時間複雜度為O(nlogn)的排序演算法時間複雜度排序演算法
- 判斷連結串列是否為迴文結構,空間負責度為O(1),時間複雜度為O(n)時間複雜度
- 時間複雜度跟空間複雜度時間複雜度
- 時間複雜度與空間複雜度時間複雜度
- 時間複雜度和空間複雜度時間複雜度
- 快速排序平均時間複雜度O(nlogn)的推導排序時間複雜度
- 122 演算法的時間複雜度和空間複雜度詳解演算法時間複雜度
- 1. 時間複雜度和空間複雜度 (7 天掌握演算法面試必考知識點)時間複雜度演算法面試
- 說說你對演算法中時間複雜度,空間複雜度的理解?如何計算?演算法時間複雜度
- 隨機列印0-100的全部數字並且不可重複,時間複雜度為O(n)隨機時間複雜度
- PHP 演算法基礎----時間複雜度和空間複雜度(轉載)PHP演算法時間複雜度
- 時間與空間複雜度分析複雜度
- 時間複雜度怎麼算?如何計算時間複雜度?時間複雜度
- 演算法的空間複雜度演算法複雜度
- 演算法與資料結構--空間複雜度O(1)遍歷樹演算法資料結構複雜度
- 【漫畫】為什麼說O(n)複雜度的基數排序沒有快速排序快?複雜度排序
- 那些年忽略的知識:時間複雜度和空間複雜度詳解時間複雜度
- 二叉樹的 Morris 中序遍歷——O(1)空間複雜度二叉樹複雜度
- 演算法的時間複雜度演算法時間複雜度
- 氣泡排序時間複雜度分析排序時間複雜度
- 一文講透演算法中的時間複雜度和空間複雜度計算方式演算法時間複雜度
- 我們常說的演算法時間複雜度和空間複雜度到底是什麼?演算法時間複雜度
- 易被忽略的知識點之 ---- 各種時間複雜度和空間複雜度時間複雜度
- 演算法(一)時間複雜度演算法時間複雜度
- 演算法分析__時間複雜度演算法時間複雜度
- 卷演算法——時間複雜度演算法時間複雜度
- O1空間複雜度實現陣列迴圈右移_LeetCode189複雜度陣列LeetCode
- 解惑3:時間頻度,演算法時間複雜度演算法時間複雜度
- 冰與火之歌:「時間」與「空間」複雜度複雜度
- 異或巧用,一道令我汗顏的演算法題——減小時間空間複雜度演算法複雜度
- 演算法題:O(1)時間複雜度實現獲取棧的最大值、最小值演算法時間複雜度