[LeetCode]Majority Element(献上膝盖的一题)

13 篇文章 0 订阅
3 篇文章 0 订阅

一、问题描述:


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/2 ⌋ 的Majority Element


然后说一下自己拿到题目的“垃圾”方法:排序O(nlogn),取排序后的nums[n/2]即可,无空间要求。


最后请出献上膝盖的答案O(n):ans为答案初始化为0,cnt为初始化为0的计数器。

线性扫描nums,设当前扫描点为nums[i]:则ans必为nums[0]~nums[i-1]之间的某数

         如果cnt == 0, 则ans=nums[i], 说明当前ans在nums[0]~nums[i-1]之间出现次数<= 非ans的出现次数之和,于是可保证原问题的ans与nums[i]~nums[n-1]中的ans相同,因为nums[0]~nums[i-1]之间没有提供足够多的ans来支持原问题==================这也是这道题归类到分治的原因,不过与大多数分治不同的是,子问题随着i的扫描在缩小。(也有人说这是DP)

         若nums[i] == ans, 则计数器cnt++

         若nums[i] != ans, 则计数器cnt--


该方法来自上世纪80年代的一篇论文研究结果 http://www.cs.utexas.edu/~moore/best-ideas/mjrty/


三、源码:

import java.util.*;
import java.io.*;
public class MajorityElement {
	public int majorityElement(int[] nums) {
        int len = nums.length;
        if (len == 0) return 0;
        int cnt=0, ans=0;
        for (int i = 0; i < len; i++) {
        	if (cnt == 0) {
        		ans = nums[i];
        		cnt++;
        	}
        	else if (nums[i] == ans) cnt++;
        	else cnt--;
        }
        return ans;
    }
    public static void main(String[] args) {
    	int[] nums = new int[Integer.parseInt(args[0])];
    	Scanner scan = new Scanner(System.in);
    	for (int i = 0; i < nums.length; i++) {
    		nums[i] = scan.nextInt();
    	}
    	MajorityElement me = new MajorityElement();
    	System.out.println(me.majorityElement(nums));
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值