題目:陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。
這題要做出來比較簡單,但是要考慮優化就不那麼容易了。首先,寫個簡單的 。
class solution
if(iter==numbermap.end())
return 0;
else
return iter->first;
}};
使用了map。遍歷時間複雜度是o(n),空間複雜度也是o(n)。
當然如果題目中確定有那麼個數出現次數超過一半,如果考慮先快排的話,時間複雜度是o(n*logn),主要用於排序的時間。也可以用快排的思想,選定標兵元素,再開始選。
書上還介紹了另外一種演算法。時間複雜度為o(n).具體為,因為有數字超過長度的一半,我們使用兩個數,乙個儲存最新的數字,乙個是它出現的次數,遍歷陣列,如果下乙個數字與之前儲存的相同,則次數加一。如果不同,則次數減一。如果次數為0,就儲存下乙個數字,且將次數設為1.因為壓找的數字比其它次數之和還多,那要找的肯定是最後設為1對應的數字。
**如下:
class solution
};
面試題29 陣列中出現次數超過一半的數字
題目 陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5詞,超過陣列長度的一半,因此輸出2.思路 1,如果對陣列排序,那麼n 2對應的數一定是超過一半的數字 前提是存在這個數字 即長度為n的陣列中第n 2大的數字,o n 2,根據陣列...
面試題29 陣列中出現次數超過一半的數字
面試題29 陣列中出現次數超過一半的數字 題目 陣列中有乙個數字的出現次數超過了陣列長度的一半,找出這個數字。常規的演算法是先對陣列排序,排序的時間複雜度是o nlogn 如果和之前儲存的數字相同,次數加1 不同則次數減1.次數為0,則儲存下乙個數字並把次數設為1.我們要找 的數字就是最後一次把次數...
面試題25 陣列中出現次數超過一半的數字
方法一 先對陣列進行排序 再遍歷排序後的陣列,統計每個數 的次數 出現次數最大的數即為要找的數。時間複雜度 o nlogn o n o nlogn 不需要額外儲存空間 方法二 先對陣列進行排序 出現次數超過陣列長度的一半的數必然是 陣列中間的那個數 時間複雜度o nlgn o 1 o nlgn 不需...