多數元素,鏈接奉上
方法
- 1.摩爾投票
- 2.合理但錯誤的方法
- 2.1暴力循環
- 2.2排序+求出中間元素中間元素

1.摩爾投票
先來簡單的介紹摩爾投票:
摩爾投票是一種用來解決絕對眾數問題的算法。
什么是絕對眾數呢?
在一個集合中,如果一個元素的出現次數比其他所有元素的出現次數之和還多,那么就稱它為這個集合的絕對眾數。等價地說,絕對眾數的出現次數大于總元素數的一半。
思路:
設置一個計數器
count
利用絕對眾數與非絕對眾數相互對抗、抵消,
首先遍歷數組
遇到相同的count++
,不同的count--
在根據count的數值設置當前的candidate
(投票對象)
因為絕對眾數>非絕對眾數,對抗過后剩下的那個元素一定是絕對眾數
代碼實現:
int majorityElement(int* nums, int numsSize)
{//mooreint i=0;int candidate=nums[0];//設置投票對象int count=1;//因為投票對象是nums[0],本身就是1票for(i=1,count=1;i<numsSize;i++)//遍歷數組{if(candidate==nums[i])//當投票對象與當前元素相同時count++count++;else{//否則count--count--;if(count<0)//當投票對象票數<0,重新選擇對象{candidate=nums[i];count=1;//票數重置為1}}}return candidate;
}
2.合理但錯誤的方法
這是題主自己經歷的錯誤,因為超出運行時間,所以不可以用
但是
注意2.2中的方法會根據排序的不同方法而產生不同影響
例如:
冒泡排序會時間出界,但快速排序不會
2.1暴力循環
馬有失蹄,暴力循環也會
思路:
設置計數器
count=0
利用外部循環變量作為數組下標,
在內層也設置一個循環變量為數組下標,
與每一個數組元素進行比較,相同時count++
當滿足count>numssize/2
時break
代碼實現:
int majorityElement(int* nums, int numsSize)
{int i = 0;for (i = 0; i < numsSize; i++){int count = 0;for (int j = 0; j < numsSize; j++){if (nums[i] == nums[j])count++;}if (count > numsSize / 2)break;}return nums[i];}
2.2排序+求出中間元素中間元素
思路:
先進行排序,之后求出nums[numsSize/2](中間元素),因為絕對眾數所占元素必定過半,故中間元素一定為絕對眾數,再return中間元素
代碼實現:
int majorityElement(int* nums, int numsSize)
{int i = 0;int tmp = 0;for (i = 0; i < numsSize - 1; i++){for (int j = 0; j < numsSize - 1 - i; j++){if (nums[j] > nums[j + 1]){tmp = nums[j];nums[j] = nums[j + 1];nums[j + 1] = tmp;}}}return nums[numsSize/2];
}
歡迎討論哦