题目
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。
我的代码
class Solution {
public int majorityElement(int[] nums) {
Stack<Integer> count = new Stack<Integer> ();
count.push(nums[0]);
for (int i=1; i<nums.length; i++){
if(count.peek() != nums[i]) {
Integer a = count.pop();
}else{
count.push(nums[i]);
}
if(count.empty()){
count.push(nums[i]);
}
}
return count.peek();
}
}
小结
这里我的思路是用栈的方法,遍历数组,第一个数入栈,此后的每一个数,如果与栈顶的数相同,则压栈;否则,出栈,如果出栈后栈为空,则将此数压栈,这样最后留在栈中的数就是出现次数最多的数。
但是程序执行结果并不是非常理想。
应该是算法整体出了问题,去答案区学习一下大佬们的代码。
他人代码
class Solution {
public int majorityElement(int[] nums) {
//可以利用hashmao来实现
//也可以使用多数投票算法,多数投票算法如下
int candidate=0;
int count=0;
for(int i=0;i<nums.length;i++){
if(count==0){
candidate=nums[i];
}
if(nums[i]==candidate){
count++;
}else{
count--;
}
}
return candidate;
}
}
如此看来和我用栈的思路差不多,只是分别用两个Int来实现相应记录。这里导致的复杂度差异可能产生在Stack的使用与其方法的调用。
但其实,除了这一次,最近一次用堆栈已经是最开始学编程,学C的时候了,借此回顾一下,也不失为一种收获。