leetoce(43).169. Majority Element

来源:互联网 发布:中国现代汉语词典软件 编辑:程序博客网 时间:2024/06/05 07:30
题意:

给一个数组,查找超过n/2(向下取整)次的元素。

初步分析:

这个题不知道在哪本书上看到过,还是怎么的。第一反应就是排序。实现之:

public int majorityElement(int[] nums) {    Arrays.sort(nums);    return nums[nums.length/2];}
还有就是以前学map的时候,也做过类似的练习题(元素出现次数的),那么map的键存储数组值,map的值存储对应出现的次数

public class Solution {   public int majorityElement(int[] nums) {    Map<Integer, Integer> map = new HashMap<Integer, Integer>();    for (int num: nums) {        if (!map.containsKey(num))            map.put(num, 1);        else{           map.put(num, map.get(num)+1);        }         if (map.get(num)>nums.length/2) {            return num;        }    }    return 0;}}

能不能用分治递归呢?有一个元素在整个数组中有一半甚至更多,我们来思考,这样的话,现在的关键是:数量多(一半或以上),位置不确定。我们现在应该怎么来应用这个条件呢?由于多于一半,我们尝试将整个数组二分,之后,唯一确定发生的事情是什么?在某一半区间里,它仍然大于等于一半。那么,继续二分呢?也一定有一半....我们是不是可以尝试用递归来解决这个问题。

试一试:然后失败了,到最后的时候,是无法判断的哪一者才是要找的元素的。


看到了一种算法,贴上来学习一下:

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;}




0 0