leetcode:Majority Element

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,真是很笨重

什么时候可以起飞···



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值