劍指39 數字中出現次數超過一半的數字 快速排序

2021-08-19 08:50:08 字數 727 閱讀 5344

題目描述

陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。

方法1:o(n) 快速排序獲得乙個座標 要求獲得的座標剛好是中間數  中間數一定出現次數超過一半

class solution 

int morethanhalfnum_solution(vectornumbers)

else

}if(overhalf(numbers,num))

return numbers.at(num);

else

return 0;

}};

方法2:兩個數 某乙個特定數值和出現次數,當迴圈中的數與特定數值一致時 次數增加 否則次數減少 次數為零重新更新特定數值並出現次數重置1 因此 出現過半的數最後一定會統計得到 其times應該剛好比一半多一些

class solution 

int morethanhalfnum_solution(vectornumbers)

else

times--;

}if(checktimes(numbers,result))

return result;

else

return 0;

}};

劍指offer39 陣列中出現次數超過一半的數字

先對陣列排序,然後取中位數,那個中位數肯定是超過一半的數字。採用快速排序時間複雜度為o nlogn 取中位數o n 基於partition函式的時間複雜度為o n 的演算法。這種演算法受快速排序演算法的啟發。在隨機快速排序演算法中,現在陣列中隨機選擇乙個 數字,然後調整陣列中數字的順序,使得比選中的...

陣列中出現次數超過一半的數字 劍指offer

陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。需要找的數字超過陣列長度的一半,那麼如果對它進行排序,再取數姐中間那個數字即為所求,但是這種做法的時間複雜度最少為o nlogn...

陣列中出現次數超過一半的數字 劍指offer

這個解法參考了劍指offer,利用快排的partition函式思想,超過一半的數字肯定是陣列的中位數,也就是下標為n 2的數字,我們每次隨機找乙個下標,然後逐步接近n 2.還要注意vector的傳參問題,partition是需要對vector進行排序的,所以要傳入引用,並且用 algorithm 中...