Leetcode-169-Majority Element

Majority Element

来自 <https://leetcode.com/problems/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的数组,找出最主要元素。最主要元素是指改元素在数组中出现的此时多余 n/2 次。假设数组不为空并且数组中一定存在最主要元素。

解析:

解法一:对数组中的元素由大到小或由小到大进行排序,返回位置 n/2 的元素就是最主要元素。

解法二:

Moore's voting algorithm算法

算法的基本思想是每次找出一对不同的元素,重数组中删掉,直到数组为空或只有一种元素。不难证明,如果存在元素e出现频率超过半数,那么数组中最后剩下的就只有e

在遍历开始之前,记最主要的元素majority为空。其出现的此时count=0

然后遍历数组nums时,如果count=0,表示当前没有候选元素,也就是说之前便利过程中没有找到超过半数的元素,那么如果超过半数的元素majority存在,那么剩下的子数组中,出现次数也一定超过半数。因此我们可以将院士问题转化为其它的子问题,此时majority为当前元素,同时count=1.

如果当前元素nums[i]==majority,那么count++.(没有找到不同元素,只需要把相同的元素累计起来)

如果当前元素nums[i]!=majority,那么count--.(相当于删除一个majority)

如果遍历结束后,count不为0,那么元素majority即为要寻找的元素。

解法三:

Map进行实现,将数组元素作为key,将该元素出现的次数作为key所对应的value值。Map初始化为空,当遇见一个新的数组元素时,先直接将该元素作为key值存放到Map中,其对应的value值为1.下次再遇见该元素,则直接将value值加1即可。数组遍历结束后,取出value大于 n/2 所对应的key值就是要寻找的最主要的元素。

解法四:

这个方法是看了Solution之后才知道的,这里假设数据值范围为(1,2^32-1),那么我们需要一个32个元素的list,初始值都为0。这里的32表示元素转换成二进制之后的32位数。对于每一位数,遍历数据list里的所有数,记录该位为1的个数。如果个数>=len(num)/2+1,则该位为1,否则为0。同理算出每一位,再转换成10进制数即为出现次数最多的数

来自 <http://www.tuicool.com/articles/EFbAnqa>

解法一代码:

  public int majorityElement(int[] nums) {
        if(null == nums)
        	return 0;
        Arrays.sort(nums);
        return nums[nums.length/2];

    }

 解法一性能:



 

 

 

解法二代码:

    public int majorityElement(int[] nums) {
        if(nums == null)
			return 0;
		int count = 0;
		int majority=0;

		for(int i=0; i<nums.length; i++) {
			if(0 == count) {
				majority = nums[i];
				count = 1;
			} else if(majority == nums[i]) {
				count++;
			} else {
				count --;
			}
		}
		return majority;
    }

解法二性能:



 

解法三代码:

public int majorityElement(int[] nums) {
        HashMap<Integer, Integer> count = new HashMap<Integer, Integer>();
		for(int a: nums) {
			if (count.containsKey(a)) {
				count.put(a, count.get(a)+1);
			} else {
				count.put(a, 1);
			}
		}
		for(int item : count.keySet()) {
			if(count.get(item) > (nums.length/2)) {
				return item;
			}
		}
		return 0;
    }

解法三性能:



 

解法四代码:

解法四代码:
    public int majorityElement(int[] nums) {
        if (nums == null || nums.length == 0)
			return 0;
		int[] dig = new int[32];
		for (int i = 0; i < nums.length; i++) {
			int temp = nums[i];
			for (int j = 0; j < 32; j++) {
				dig[j] += temp & 1;
				temp = temp >> 1;
			}
		}
		int count = nums.length / 2;
		int res = 0;
		int temp = 1;
		for (int i = 0; i < 32; i++) {
			if (dig[i] > count)
				res = res | temp;
			temp = temp << 1;
		}
		return res;
    }

解法四性能:



 

猜你喜欢

转载自logicluo.iteye.com/blog/2238135