【題目要求】給你n個數與n。現在需要你在o(n)的時間內,o(1)的空間內找出出現次數超過50%的數。
【開始胡扯】一開始我看到這道題瞬間蒙蔽(tot)/~~~(。﹏。*),要是只有o(n)的時間這一條要求,就可以用雜湊瞬間解決(也就是用空間換時間),對於o(1)的空間好像很難解決。
【思路一】雙重迴圈,這是解決這道題效率最低的方法了,也就是對每個數都計算它出現的次數,時間複雜度 o(n^2) 直接out。
【思路二】先排序,讓相近的數字排在一起,然後從第乙個數開始遍歷,現在給乙個例子,如:1000012,現在進行排序:0000112,從0開始,設定乙個計數器t=0,現在有4個0,則t=4,發現超過了半數,輸出0。這個方法就是上乙個方法的優化版,out。
【思路三】就是以空間換時間,雜湊的思想,使乙個一維陣列有兩個含義。比如a[x]=y代表x這個數出現了y次,這個方法時間複雜度是o(n),但是空間實在是……不說了(*  ̄︿ ̄) out
【思路四】先算出概率,選出這些數中最有可能符合要求的幾個數,再隨機抽取幾個。這……還是算了吧。
【思路五】今天的主題,就是所謂的mjrty演算法,也叫多數投票演算法,主要思路如下:(這個演算法時間複雜度o(n)!空間上不需要額外的儲存,所以空間複雜度是o(1)!!!!!!)
如果count==0,則將vote的值設定為陣列的當前元素,將count賦值為1;
否則,如果vote和現在陣列元素值相同,則count++,反之count–;
重複上述兩步,直到掃瞄完陣列。
count賦值為0,再次從頭掃瞄陣列,如果陣列元素值與vote的值相同則count++,直到掃瞄完陣列為止。
如果此時count的值大於等於n/2,則返回vote的值,反之則返回-1;
以下是**實現,由於題目保證結果一定存在,所以我們省去了最後一步的檢查驗證。
【**奉上】
#includeusing namespace std;int len;
int main()
}cout/system("pause");
return 0;
}
部落格233 尋找出現次數超過一半的數字
內容 編寫程式,尋找資料集合 現次數超過一半的數字 思路 設定乙個計數變數和乙個比較變數,當遇到下乙個數字與比較變數相同,則計數加1,不同則減1。計數減為0 時更新比較變數為新值。因為有乙個數出現次數超過一半,那麼最後比較變數的值就是這個元素,因為它的 出現次數大於一半,因為其它數的出現次數不足以使...
演算法 找出陣列中出現次數超過一半的數
演算法 找出陣列中出現次數超過一半的數 每當我看到經典的演算法題,就懷念高中,感覺很多演算法題就是高中的題目,誰叫哥唯讀了個專科,高數基本相當沒學。有空要看看高數啊,想當年數學那是相當的.方法一 第乙個想到的方法是見乙個二維陣列,一維存陣列中的資料,二維存這個數出現的次數。出現次數最多的那個數就是要...
演算法 找出陣列中出現次數超過一半的數
演算法 找出陣列中出現次數超過一半的數 每當我看到經典的演算法題,就懷念高中,感覺很多演算法題就是高中的題目,誰叫哥唯讀了個專科,高數基本相當沒學。有空要看看高數啊,想當年數學那是相當的.include using namespace std class findtheone int b 2 new...