这个题的名字是在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;
}
}
本文介绍了一种高效算法——摩尔投票法,用于在时间复杂度为O(n)和空间复杂度为O(1)的情况下找出数组中的多数元素。文章通过两个示例展示了如何实现该算法,并分别处理了多数元素出现次数超过一半和超过三分之一的情况。
168万+

被折叠的 条评论
为什么被折叠?



