資料結構面試題總結1——陣列:求最大、次大值
一般大家一開始想到的辦法就是一次迴圈,記錄下最大值和最小值。或者就是用兩次冒泡,找到最大值和次大值。
這兩種方法實踐複雜度差不多都是O(2n),如果陣列很長,效率還是不夠高的。
注意:直接排序,再選擇最大的兩個值,這並不是一個好辦法,因為我們只需要前兩個數有序,不需要後N-2個數有序。
冒泡方法我就不幫大家實現了。程式設計的細節要注意,陣列a只是個示例,如果有負值,max和second_max的初始化要最小,以免出錯。
int main(int argc, char* argv[]) { int a[] = {1,2,3,4,5,6,7,8,9}; int max = 0; int second_max = 0; for (int i = 0; i < 9; i++) { if (a[i] > max) { second_max = max; max = a[i]; } else if (a[i] > second_max) { second_max = a[i]; } } cout << max << endl; cout << second_max << endl; return 0; }
我們繼續思考,最大值和次大值其實就是要兩個排序結果,在排序中我們當然有更快的演算法(線性排序演算法,歸併,快速,堆排序),我們有沒有辦法使用這些方法呢?
想弄清楚上面的問題,我們再看一個此問題的延伸問題,也是很典型的題,程式設計之美上有的!
查詢最大無序量元素中最大的K個數。
這篇文章分析的很棒:http://blog.csdn.net/xiaoding133/article/details/8037086。
看完以後發現第一種方法,就是我們前面所想到的。
第二種方法,依賴快速排序所選擇的值,平均複雜度為O(N*logK),在K為2的時候,平均複雜度O(n)看起來不錯,但是效率很不穩定。
第三種方法,用一個k容量的堆,K為2的時候,容量2,高度也為2。乍一看好像不錯,但其實和我上面所寫的程式碼是一樣的效果。但是這裡要注意了,我們可以考慮一下堆排序中的初始堆(大頂堆)建立,建立完後陣列的前三位一定包含最大值和次大值,時間複雜度為O(n)。這裡用O(n)來比較不太確切,大家可以看看大頂堆建立時間複雜度的推導。
注意:這個方法也只能針對於求前二大值,這是二叉樹的特有的。再多就要用此文章中的方法。
第四種方法不好。
第五種方法,就是線性排序的方法,穩定在O(n),當然這裡還需要一點時間去取出最終結果。但是受到容量的限制就沒辦法用了,還有變數型別,整型。
相關推薦
資料結構面試題總結1——陣列:求最大、次大值
一般大家一開始想到的辦法就是一次迴圈,記錄下最大值和最小值。或者就是用兩次冒泡,找到最大值和次大值。 這兩種方法實踐複雜度差不多都是O(2n),如果陣列很長,效率還是不夠高的。 注意:直接排序,再選擇最大的兩個值,這並不是一個好辦法,因為我們只需要前兩個數有序,不需要後N-
資料結構面試題總結2——陣列:求出現次數超過一半的元素
遇到這個題最簡單的想法就是,統計每個元素出現的次數。但是無法知道陣列中有多少種元素,並且這樣會用到其他的儲存空間,再查詢結果的時候也需要多遍歷一次結果的陣列。 正確的解決辦法是去記錄重複元素(不管是否是結果元素)的數量,然後碰見一個不同元素就減一(相當於抵消了),碰見結果元
資料結構面試題總結6——陣列:求兩個陣列中滿足給定和的兩個元素
問題描述:在兩個有序陣列中,分別找出a,b兩個元素滿足a+b = c,c已知。 分析:我們要用有序這個有利條件,避免迴圈中套迴圈。我們用兩個索引i,j分別指向陣列A,B的首尾,根據比較的結果來移動索引的位置。 如果 A[i] + B[j] < c , i+
資料結構面試題總結5——陣列:找出陣列中唯一一個出現一次的元素
問題描述:一個數組其中有一個元素出現了一次(奇次),其他元素都出現兩次(偶數次數),找出出現一次(奇次)的元素。 分析:碰到這種偶次奇次的問題,首先要想一下位運算中的異或。一個數異或本身為0,一個數異或0不變。a ^ a = 0, a ^ 0 = a。 這個題中,我們可以把
iOS 面試題(1):一個 Objective-C 物件的記憶體結構是怎樣的?
接下來分享的將會是唐老師一系列的iOS面試題,因為之前好幾期唐老師都刪掉了,說是要出書,所以轉載過來,需要的朋友們可以看下,也方便我自己鞏固、學習。 轉載自:http://mp.weixin.qq.com/s?__biz=MjM5NTIyNTUyMQ==&mid=
3D引擎資料結構與glTF(1):簡介
不是有句老話講“程式 = 演算法 + 資料結構”嘛,對於3D引擎來說也是這樣。學習和掌握3D引擎中的核心資料有哪些,它們直接的關係是怎樣等等問題,對於理解3D引擎的架構和圖形渲染關係都有著非常大的幫助。然而,現在的商業3D引擎非常複雜,想要通過學習其原始碼嘛非常困難,那麼你就這樣放棄了嗎
資料結構面試題oj練習
題 oj 連結:https://leetcode-cn.com/problems/remove-linked-list-elements/description/ /** * Definition for singly-lin
python面試題總結(1)
1、描述一下python語言 Python是一種程式語言,它有物件、模組、執行緒、異常處理和自動記憶體理。 它簡潔、簡單、方便、容易擴充套件,有許多自帶的資料結構,而且它開源。 2、程式設計:寫出你所瞭解的排序演算法,並且使用python實現一種 排序的方法有: 插入排序
深度學習面試題總結1-20
1.CNN的卷積核是單層還是多層的 答:描述網路模型中某層的厚度,通常用名詞通道channel數或者特徵圖feature map數。不過人們更習慣把作為資料輸入的前層的厚度稱之為通道數(比如RGB三色圖層稱為輸入通道數為3),把作為卷積輸出的後層的厚度稱之為特徵圖數。 卷
Java 程式設計師必須掌握的 8 道資料結構面試題,你會幾道
瑞士電腦科學家Niklaus Wirth在1976年寫了一本書,名為《演算法+資料結構=程式設計》。 40多年後,這個等式仍被奉為真理。這就是為什麼在面試過程中,需要考察軟體工程師對資料結構的理解。 幾乎所有的問題都需要面試者對資料結構有深刻的理解。無論你是初入職場的
部分面試題總結1
https://www.nowcoder.com/discuss/132259?type=2&order=0&pos=16&page=1 一、執行緒池的底層怎麼實現的? 執行緒池作用: 1、降低資源消耗 2、提高相應速度 3、提高穩定性
資料結構面試題(含答案)
1.棧和佇列的共同特點是(只允許在端點處插入和刪除元素) 4.棧通常採用的兩種儲存結構是(線性儲存結構和連結串列儲存結構) 5.下列關於棧的敘述正確的是(D) A.棧是非線性結構B.棧是一種樹狀結構C.棧具有先進先出的特徵D.棧有後進先出的特徵 6.連結串列不具有的特點是(B)A.不必事先估計儲存
資料結構面試題/判斷一棵樹是否是完全二叉樹
二叉樹: 1.滿二叉樹:在一棵二叉樹中,如果所有分支節點都存在左子樹和右子樹,並且所有葉子節點都在同一層上。 2.完全二叉樹:如果一棵具有N個結點的二叉樹的結構與滿二叉樹的前N個結點的結構相同,稱為完全二叉樹。 //判斷一棵二叉樹是否是完全二叉樹--利
大資料研發面試題總結
面試方向:大資料研發 Java部分 Java的集合類有哪些? ArrayList和LinkedList的區別 ArrayList的動態擴容是怎麼實現的 HashMap的底層儲存結構是什麼樣的
python+演算法+資料結構+面試題
一、單鏈表反轉 #!/usr/bin/python #遞迴實現單鏈表反轉 class ListNode(object): def __init__(self,x): self.val=x self.next=None def recurse(hea
資料結構學習筆記(1):Maximum Subsequence Sum最大子列和
問題思路分析:就是課堂上所講過的最大子列和問題,不過需要輸出子列頭和尾的項根據網上的資料,摹寫程式碼為具體實現:#include<iostream> using namespace std; int main (){ int N ; cin >>
Java常見資料結構面試題(帶答案)
1.棧和佇列的共同特點是(只允許在端點處插入和刪除元素)4.棧通常採用的兩種儲存結構是(線性儲存結構和連結串列儲存結構)5.下列關於棧的敘述正確的是(D) A.棧是非線性結構B.棧是一種樹狀結構C.棧具有先進先出的特徵D.棧有後進先出的特徵6.連結串列不具有的特點是(
面試題【1】:i++是否原子操作?並解釋為什麼?
不是原子操作。理由: 1.i++分為三個階段: 記憶體到暫存器 暫存器自增 寫回記憶體 這三個階段中間都可以被中斷分離開. 2.++i首先要看編譯器是怎麼編譯的, 某些編譯器比如VC在非優化版本中會編譯為以下彙編程式碼: __asm{ moveax, dw
Java資料結構面試題
1.棧和佇列的共同特點是(只允許在端點處插入和刪除元素) 4.棧通常採用的兩種儲存結構是(線性儲存結構和連結串列儲存結構) 5.下列關於棧的敘述正確的是(D) A.棧是非線性結構B.棧是一種樹狀結構C.棧具有先進先出的特徵D.棧有後進先出的特徵 6.連結串列不具有的
演算法與資料結構番外(1):優先佇列
這是演算法與資料結構番外系列的第一篇,這個系列未來的主要內容是補充一些與演算法與資料結構相關的知識,這些知識比較零碎,同時也與[正傳](https://albertcode.info/?tag=algorithm)關係密切,往往需要閱讀了正傳的相關內容以後,才能較好的理解這部分內容。如果對番外系列不感興趣的話