題目
描述
給定一個整型數組,找出主元素,它在數組中的出現次數嚴格大于數組元素個數的二分之一。
樣例
給出數組[1,1,1,1,2,2,2]
,返回 1
解答
思路
看到這個題目,第一反應是排序后取中間數,這沒什么好說的。
這個題目的挑戰是時間復雜度為O(n),空間復雜度是O(1)。這個有點意思。
如果一個數組存在主元素,那么在數組中刪除兩個不同的數,對于主元素的地位是沒有影響的。根據這個思路設計算法。
代碼
public class Solution {
/**
* @param nums: a list of integers
* @return: find a majority number
*/
public int majorityNumber(ArrayList<Integer> nums) {
// write your code
/**
* count: 統計當前認為的主元素的數量
* seed: 當前認為的主元素
* n: 數組長度
**/
int count = 0, seed = nums.get(0), n = nums.size();
//從兩頭往中間循環
for(int i = 1; i<n/2; i++){
//若兩數相等,主元素備選
if(nums.get(i) == nums.get(n-i)){
//若當前沒有認為的主元素
if(count == 0){
//那么取當前數為主元素
seed = nums.get(i);
//統計加一
count++;
}
//若已有認為的主元素
else{
// 若與主元素相等,統計量加一
if(seed == nums.get(i)) count++;
// 若與主元素不等,統計量減一
// 這里如果減小到0了,可能會產生主元素切換
else count--;
}
}
}
//統計主元素出現的次數
for(int i = 0;i<n;i++){
if(nums.get(i) == seed){
count++;
}
}
//超過一半才被認為是主元素
if(count >= n/2){
return seed;
}
//提交了幾次發現如果沒超過一半需要返回最后的元素
else{
return nums.get(n-1);
}
}
}