已知乙個整數序列a=(a0,a1,…,an-1),其中0≤ain/2(0≤pk假設a中的n個元素儲存在乙個一維陣列中,請設計乙個盡可能高效的演算法,找出a的主元素。若存在主元素,則輸出該元素;否則輸出-1
【測試樣例】
【輸出結果】5
【測試樣例】
【輸出結果】-1
選取候選的主元素:依次掃瞄陣列中的數,將第乙個遇到的數tmp儲存在c中,記錄tmp出現的次數為1;繼續掃瞄,若下乙個數仍等於tmp,則計數+1,否則計數-1,當計數減到0時,將遇到的下乙個整數儲存到c中,計數重新記為1,開始新一輪計數,重複上述過程,直到掃瞄完全部陣列元素。
判斷c是否為真正的主元素:再次掃瞄陣列,統計c出現的次數,若大於n/2,則為主元素;否則不存在主元素
上述演算法的時間複雜度為o(n),採用空間複雜度為o(1)
int findmainelem(int r,int n)
if(count>0)
for(i=count=0;in/2)
return c;
else return -1;
}
使用快速排序對陣列元素進行排序,為減少時間複雜度
新建標誌位統計元素出現的個數,從第1個元素開始遍歷陣列,若和前一元素相同則標誌陣列元素在之前基礎上+1,若不同,則置為0;其中使用max暫存最大值
上述演算法的時間複雜度為o(nlog2n),採用空間複雜度為o(1)
//附加快速排序**
int partition(int r,int low,int high)
2023年408真題 線性表
問題描述 設將n n 1 個整數存放在一維陣列r中。試設計乙個在時間和空間兩方面都盡可能高效的演算法。將r中儲存的序列迴圈左移p p 0 個位置。例如,假設p 測試樣例 r p 3 輸出結果 3 4 5 6 0 1 2 將陣列r x0,x1 xn 1 分成兩部分 x0,x1,xp 1 xp,xp 1...
2023年的408演算法題
思路一 使用hash對映打表,每出現一次次數加1,如果次數有超過n 2,則存在主元素,反之,則不存在。缺點 需要輔助陣列 思路二 兩兩相互抵消。如果陣列中存在大於一般的相同元素,首先假設第乙個元素為主元素的候選元素 統計個數為1 如果目前元素統計的個數大於0,遇到相同的數字 個數加1,不同的數字 個...
線性表客觀題 2021 1 11
1 1 對於順序儲存的長度為n的線性表,訪問結點和增加結點的時間複雜度分別對應為o 1 和o n t 1 2 若某線性表最常用的操作是訪問任一指定序號的元素和在最後進行插入和刪除運算,則利用順序表儲存最節省時間。t 1 3 在具有n個結點的單鏈表中,訪問結點和增加結點的時間複雜度分別對應為o 1 和...