演算法面試 一

2021-08-06 04:57:51 字數 2098 閱讀 1517

之前面試的時候,遇到了許多關於基本演算法的題目,對於其**的編寫以及特殊情況下的優化及改進等,及演算法相關的學習有了更多的感悟與領會,與大家分享一下,此處以快排講解為例;
快排的核心思想很簡單:就是先選擇乙個槓桿元素(一般選第乙個數),對剩下元素遍歷,大的放右邊,小的放左邊;然後對於兩邊元素再次用以上方法進行遞迴處理;

// v為pivot,初始儲存在arr[0]的位置 

int j = 0; // 迴圈過程保持 arr[0...j] < v ; arr[j+1...i) > v

for( int i = l + 1 ; i <= n ; i ++ )

if( arr[i] < v )

swap( arr[++j] , arr[i] );

swap( arr[l] , arr[j]); // 此時,j指向pivot的正確位置

例項: 483

0527

4 j=048

438 j=143

08 j=243

0854

3028

5 j=343

0285

7230

4857

我們知道對於快速排序演算法,當元素排序是隨機無序的時候,也就是當每遞迴完一次的時候,其元素大約成雙等分時其效率是最高的,類似於二叉排序樹,時間複雜度為o(n*lg n);然而大多數情況下事與願違,當元素接近有序或者擁有大量重複元素時其效率將大大降低為o(n^2),所以對於此種情況我們需要考慮在內,提出以下解決辦法:

(1)如果我們一開始不知道陣列是否基本有序,那麼對於槓桿元素的選擇上,我們可以實現隨機選擇乙個元素作為pivot,這樣同樣可以降低有序的概率從而整體提高排序效率;

(2)如果我們事先知道陣列含有大量重複元素,則對於上面演算法還可以再次改進,稱為三路快排:小於的為一路,等於的為一路,大於的為一路,演算法如下:

// v為pivot,初始儲存在arr[0]的位置

int lt = 0; // 迴圈過程中保持 arr[1...lt] < v

int i = 1; // 迴圈過程中保持 arr[lt+1...i) == v

int gt = n + 1; // 迴圈過程中保持 arr[gt...n] > v

while( i < gt ) else

if( arr[i] > v ) else

// arr[i] == v

i ++;

} swap( arr[l] , arr[lt] );

// 此時 arr[lt...gt-1]部分為陣列中元素等於v的部分

// 之後只需要遞迴地對arr[l...lt-1]和arr[gt...r]兩部分進行三路快排即可

基於比較的排序演算法,其時間複雜度至少為o(nlogn).

擴充套件面試題:有乙個陣列,其中的元素取值只有可能是0,1,2。為這樣乙個陣列排序。

/// 解法一:直接使用排序介面,時間複雜度o(nlogn)

class solution };

// 解法二:基於計數排序的解法,時間複雜度o(n),需要兩遍遍歷 ,

//第一次統計元素個數,第二次放回原陣列

class solution ; // count[i]表示元素i的個數

for( int i = 0 ; i < nums.size() ; i ++ )

int index = 0;

for( int i = 0 ; i < count[0] ; i ++ ) // 安置count[0]個0

nums[index++] = 0;

for( int i = 0 ; i < count[1] ; i ++ ) // 安置count[1]個1

nums[index++] = 1;

for( int i = 0 ; i < count[2] ; i ++ ) // 安置count[2]個2

nums[index++] = 2; return;

} };

// 解法三:基於三路快排的partition的解法,時間複雜度o(n),只需要一邊遍歷

class solution

} return;

} };

借鑑有感:

演算法面試(一)

學習劉宇波老師的演算法面試課,記個筆記!課程目標 我的目標 面對演算法問題時,有乙個合理的思考路徑,不畏懼演算法!對演算法面試而言 不一定需要正確的回答每乙個演算法問題,但是合理的思考方向是最重要的,這也是完成演算法面試的前提。演算法面試優秀不意味著技術面試優秀,技術面試優秀不意味著能拿到offer...

面試演算法題總結 一

華為面試題 寫乙個程式,要求功能 求出用1 2 5 這三個數不同個數組合的和為100 的組合個數。如 100 個1 是乙個組合,5 個1 加19 個5 是乙個組合。請用c 語言寫。答案 最容易想到的演算法是 設x 是1 的個數,y 是2 的個數,z 是5 的個數,number 是組合數 注意到0 x...

演算法崗面試題(一)

阿里 對於大資料方面的問題可參考 二面 相隔時間有三周左右,本來以為沒戲了 二面是個大叔,問了專案中的fm和ffm的區別 參考問的主要是專案上的,問了天池大資料比賽的一些問題,因為說了平時會關注最新技術動態,因為就叫我舉個例子,剛好看過微軟識花的那篇文章就好好講了下。最後問了下工作地啥的。二面就40...