資料結構面試題總結1 陣列 求最大 次大值

2021-07-02 22:16:20 字數 1030 閱讀 6430

一般大家一開始想到的辦法就是一次迴圈,記錄下最大值和最小值。或者就是用兩次冒泡,找到最大值和次大值。

這兩種方法實踐複雜度差不多都是o(2n),如果陣列很長,效率還是不夠高的。

注意:直接排序,再選擇最大的兩個值,這並不是乙個好辦法,因為我們只需要前兩個數有序,不需要後n-2個數有序。

冒泡方法我就不幫大家實現了。程式設計的細節要注意,陣列a只是個示例,如果有負值,max和second_max的初始化要最小,以免出錯。

int main(int argc, char* argv)

; int max = 0;

int second_max = 0;

for (int i = 0; i < 9; i++)

else if (a[i] > second_max)

}cout << max << endl;

cout << second_max << endl;

return 0;

}

我們繼續思考,最大值和次大值其實就是要兩個排序結果,在排序中我們當然有更快的演算法(線性排序演算法,歸併,快速,堆排序),我們有沒有辦法使用這些方法呢?

想弄清楚上面的問題,我們再看乙個此問題的延伸問題,也是很典型的題,程式設計之美上有的!

查詢最大無序量元素中最大的k個數。

看完以後發現第一種方法,就是我們前面所想到的。

第二種方法,依賴快速排序所選擇的值,平均複雜度為o(n*logk),在k為2的時候,平均複雜度o(n)看起來不錯,但是效率很不穩定。

第三種方法,用乙個k容量的堆,k為2的時候,容量2,高度也為2。乍一看好像不錯,但其實和我上面所寫的**是一樣的效果。但是這裡要注意了,我們可以考慮一下堆排序中的初始堆(大頂堆)建立,建立完後陣列的前三位一定包含最大值和次大值,時間複雜度為o(n)。這裡用o(n)來比較不太確切,大家可以看看大頂堆建立時間複雜度的推導。

第四種方法不好。

第五種方法,就是線性排序的方法,穩定在o(n),當然這裡還需要一點時間去取出最終結果。但是受到容量的限制就沒辦法用了,還有變數型別,整型。

java c 資料結構面試題總結

一.判斷鍊錶是否存在環型鍊錶問題 說明 判斷乙個鍊錶是否存在環,例如下面這個鍊錶就存在環,n1 n2 n3 n4 n5 n2,環的開始結點是n5 解法 這裡有個比較簡單的解法 設兩個指標p1,p2,每次迴圈p1向前走一步,之向前走兩步,直到p2碰到null指標 無環 或兩個指標相等結束迴圈演算法 有...

java c 資料結構面試題總結

一.判斷鍊錶是否存在環型鍊錶問題 說明 判斷乙個鍊錶是否存在環,例如下面這個鍊錶就存在環,n1 n2 n3 n4 n5 n2,環的開始結點是n5 解法 這裡有個比較簡單的解法 設兩個指標p1,p2,每次迴圈p1向前走一步,之向前走兩步,直到p2碰到null指標 無環 或兩個指標相等結束迴圈演算法 有...

資料結構 面試題

python實現 寫個大概,import re def quick sort alist,first,last if first last return mid value alist first low first high last while low high while low mid va...