import java.util.ArrayList;
import java.util.List;
public class MajorElements229 {
public List<Integer> majorityElement1(int[] nums) //算法的精妙之处在于,如果不存在多于三分之一的元素的值,则次多元素是错误的,所有还要在最后做一次遍历和统计。
{
List<Integer> mylist=new ArrayList<Integer>();
if(nums==null||nums.length==0) return mylist;
int number1 = nums[0], number2 = nums[0], count1 = 0, count2 = 0, len = nums.length;
for (int i = 0; i < len; i++)
{
if (nums[i] == number1)//number1去记录最多的那个数
count1++;
else
if (nums[i] == number2)//number2去记录次多的那个数
count2++;
else
if (count1 == 0) //若当前的count被消耗为0,则用当前遍历到的数代替
{
number1 = nums[i];
count1 = 1;
}
else
if (count2 == 0)
{
number2 = nums[i];
count2 = 1;
}
else
{
count1--;//若当前数不等于记录着的前两大的数,则前两大的数减一
count2--;
}
}
count1=0;
count2=0;
for(int i:nums)
{
if(i==number1)
count1++;
else if(i==number2)
count2++;
}
if(count1>nums.length/3) mylist.add(number1);
if(count2>nums.length/3&&number1!=number2) mylist.add(number2);
return mylist;
}
public int majorityElement(int[] num) {
int n = num.length;
int candidate = num[0], counter = 0;
for (int i : num) {
if (counter == 0) {
candidate = i;
counter = 1;
} else if (candidate == i) {
counter++;
} else {
counter--;
}
}
return candidate;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] nums=new int[]{1,2,3};
MajorElements229 mel=new MajorElements229();
System.out.println(mel.majorityElement1(nums));
}
}
229. Majority Element II
My Submissions
import java.util.ArrayList;
import java.util.List;
public class MajorElements229 {
public List<Integer> majorityElement1(int[] nums) //算法的精妙之处在于,如果不存在多于三分之一的元素的值,则次多元素是错误的,所有还要在最后做一次遍历和统计。
{
List<Integer> mylist=new ArrayList<Integer>();
if(nums==null||nums.length==0) return mylist;
int number1 = nums[0], number2 = nums[0], count1 = 0, count2 = 0, len = nums.length;
for (int i = 0; i < len; i++)
{
if (nums[i] == number1)//number1去记录最多的那个数
count1++;
else
if (nums[i] == number2)//number2去记录次多的那个数
count2++;
else
if (count1 == 0) //若当前的count被消耗为0,则用当前遍历到的数代替
{
number1 = nums[i];
count1 = 1;
}
else
if (count2 == 0)
{
number2 = nums[i];
count2 = 1;
}
else
{
count1--;//若当前数不等于记录着的前两大的数,则前两大的数减一
count2--;
}
}
count1=0;
count2=0;
for(int i:nums)
{
if(i==number1)
count1++;
else if(i==number2)
count2++;
}
if(count1>nums.length/3) mylist.add(number1);
if(count2>nums.length/3&&number1!=number2) mylist.add(number2);
return mylist;
}
public int majorityElement(int[] num) {
int n = num.length;
int candidate = num[0], counter = 0;
for (int i : num) {
if (counter == 0) {
candidate = i;
counter = 1;
} else if (candidate == i) {
counter++;
} else {
counter--;
}
}
return candidate;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] nums=new int[]{1,2,3};
MajorElements229 mel=new MajorElements229();
System.out.println(mel.majorityElement1(nums));
}
}
Total Accepted: 29245
Total Submissions: 112956
Difficulty: Medium
Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋
times. The algorithm should run in linear time and in O(1) space.
题目要求:在一个给定数组中查找多于总元素数三分之一的元素值,本题采用了 一次遍历便可 得出结果的 Boyer–Moore 算法,设置两个
变量 count1 count2 进行判断的 if else 共有四对,依次判断 number=nums[i] count=0.本题也可采用先排序再进行计算的方法,对于排序后的数组
仍然进行遍历,可以用 n/3为长度对结果进行遍历,若是元素从第一次出现的位置与其后的n/3元素相同,那该元素则出现频率多余三分之一,接着遍历i+n/3,
否则继续i=i+1;
博耶 穆尔算法实现如下: