Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋
times.
You may assume that the array is non-empty and the majority element always exist in the array.
貌似后面还有一题,是找出超过n/3的,那题我还没做,不过已经自己写了代码了先说下超过1/2的!
可以用HashMap,逻辑很清晰(我这种比较蠢的,很喜欢···)
然后发现网上好多摩尔投票算法的代码,这个算法实在是精美
话不多说,贴上代码
public class Solution {
public int majorityElement(int[] nums) {
int count=0, ret = 0;
for (int num: nums) {
if (count==0)
ret = num;
if (num!=ret)
count--;
else
count++;
}
return ret;
}
}
我还看到一个牛人···
他把这个数组拍了个序,直接返回中间的那个元素,实在是特么机智啊···(WTF!!!!!)
下面就是那个超过n/3的(貌似是要检验的,但是这里我就不检验,就是找到潜在的那个元素)
核心原理其实和n/2是一样的,就是选出潜在候选对象,然后后面有与其相同的就投一票,不同就减一票,票数为0就放弃这个候选对象,换为下一个
但是到了n/3的时候,可能会有两个元素符合要求
那么,当第一个潜在元素发现和下一个比较对象不同的时候,要去看看此时是不是第二个潜在元素就是这个对象,如果是的话,自己的票数是不需要减的!
就是这个逻辑上的判断,我搞的很混乱,主要是蠢、渣!!我自己写的判断实在屎,写完后还开心的不得了···
后来发现了别人的代码···真是爆了哈士奇了!
下面的数组a,就是题设的数组,我随便启了个名字
int s1=0;
int count1=0;
int s2=0;
int count2=0;
for(int i=1;i<a.length;i++){
if(count1==0||s1==a[i]){
count1++;
s1=a[i];
}else if(count2==0||s2==a[i]){
count2++;
s2=a[i];
}else{
count1--;
count2--;
}
}
然后,如果数组中存在超过n/3次的元素的话,一定就在s1和s2中,这时候需要你写个循环检验一下就行了,看看是不是大于了n/3,如果不是舍弃就是了
然后,在不考虑各种时间空间的复杂度,我觉得用hashMap挺直观的···
下面的数组a,就是题设的数组,我随便启了个名字
Map<Integer, Integer> hash=new HashMap<>();
int count=0;
for(int i=0;i<a.length;i++){
if(hash.containsKey(a[i])){
hash.put(a[i], hash.get(a[i])+1);
}else{
hash.put(a[i], 1);
}
}
int[] b={0};
int i=0;
for (Entry<Integer, Integer> entry : hash.entrySet()) {
if(entry.getValue()>a.length/3){
//System.out.println(entry.getKey());
b[i]=entry.getKey();
i++;
}
}
结果就在数组b中,总之我觉得这个很直观···
做了几天的leetcode上的题目了,有点小感慨,感觉这些题目···在没见过类似类型的情况下,我是做不出来的
不知道大牛们在成为大牛的路上时候,是不是曾经怀疑过自己,觉得自己很蠢呢?
这些精妙的算法是一种享受,也是一种折磨
就像这个题目,在我没有遇到类似题目之前,让我做,无非是疯狂遍历,或者各种hash,真是很笨重
什么时候可以起飞···