这个题的名字是在lintcode中,在leetcode中的名字是Majority Element,虽然有少许不同,但是主要都是一样的。
这个题很简单,但是如果要满足n的时间复杂度和1的空间复杂度则需要摩尔投票法。废话不多说了,直接上代码。
I:
public class Solution {
/**
* @param nums: a list of integers
* @return: find a majority number
*/
public int majorityNumber(ArrayList<Integer> nums) {
// write your code
int length = nums.size();
if (length <= 0){
return 0;
}
if (length == 1){
return nums.get(0);
}
int count = 1;
int index = 0;
for (int i = 1; i < length; i++){
if (nums.get(index) == nums.get(i)){
count++;
} else {
count--;
if (count == 0){
index = i;
count = 1;
}
}
}
int res = nums.get(index);
count = 0;
for (int i = 0; i < length; i++){
if (res == nums.get(i)){
count++;
}
}
if (count > length / 2){
return res;
}
return 0;
}
}
II:
public class Solution {
/**
* @param nums: A list of integers
* @return: The majority number that occurs more than 1/3
*/
public int majorityNumber(ArrayList<Integer> nums) {
// write your code
int length = nums.size();
if (length <= 0){
return 0;
}
if (length == 1){
return nums.get(0);
}
int counta = 0;
int a = 0;
int countb = 0;
int b = 0;
for (int num : nums){
if (num == a){
counta++;
} else if (num == b){
countb++;
} else {
if (counta == 0){
counta = 1;
a = num;
} else if (countb == 0){
countb = 1;
b = num;
} else {
counta--;
countb--;
}
}
}
counta = 0;
countb = 0;
for (int num : nums){
if (num == a){
counta++;
} else if (num == b){
countb++;
}
}
if (counta > length / 3){
return a;
}
if (countb > length / 3){
return b;
}
return 0;
}
}