Leetcode#169. Majority Element(求众数)
题目描述
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。
示例 1:
输入: [3,2,3]
输出: 3
示例 2:
输入: [2,2,1,1,1,2,2]
输出: 2
思路
思路一:
利用哈希表的映射,储存数组中的数字以及它们出现的次数,当众数出现时,返回这个数字。
思路二:
因为众数是出现次数大于n/2的数字,所以排序之后中间的那个数字一定是众数。即nums[n/2]为众数。但是在计算比较大的数组时,时间会超过限制。
思路三:
分治法,将整个数组分成两个部分,先分别筛选出这两部分中出现次数最多的数,记为left和right,如果left等于right,则返回left,如果left不等于right,则left和right都是最终结果的候选,此时需要遍历整个数组考察left和right出现的次数,出现次数较多的就是最终返回的结果。
思路四:
摩尔投票算法,先将第一个数字假设为众数,然后把计数器设为1,比较下一个数和此数是否相等,若相等则计数器加一,反之减一。然后看此时计数器的值,若为零,则将当前值设为候选众数。以此类推直到遍历完整个数组,当前候选众数即为该数组的众数。
代码实现
package Array;
import java.util.HashMap;
/**
 * 169. Majority Element(求众数)
 * 给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
 * 你可以假设数组是非空的,并且给定的数组总是存在众数。
 */
public class Solution169 {
    public static void main(String[] args) {
        Solution169 solution169 = new Solution169();
        int[] nums = new int[]{3, 2, 3};
        System.out.println(solution169.majorityElement_4(nums));
    }
    /**
     * 利用哈希表的映射,储存数组中的数字以及它们出现的次数,当众数出现时,返回这个数字。
     *
     * @param nums
     * @return
     */
    public int majorityElement(int[] nums) {
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int num :
                nums) {
            Integer cnt = map.get(num);
            if (cnt == null) {
                cnt = 1;
            } else {
                cnt++;
            }
            if (cnt > nums.length / 2) {
                return num;
            }
            map.put(num, cnt);
        }
        return 0;
    }
    /**
     * 因为众数是出现次数大于n/2的数字,所以排序之后中间的那个数字一定是众数。即nums[n/2]为众数。但是在计算比较大的数组时,时间会超过限制。
     *
     * @param nums
     * @return
     */
    public int majorityElement_2(int[] nums) {
        int n = nums.length;
        for (int i = 0; i < n - 1; i++) {
            for (int j = 0; j < n - 1 - i; j++) {
                if (nums[j] > nums[j + 1]) {
                    int temp = nums[j];
                    nums[j] = nums[j + 1];
                    nums[j + 1] = temp;
                }
            }
        }
        return nums[n / 2];
    }
    /**
     * 分治法,将整个数组分成两个部分,先分别筛选出这两部分中出现次数最多的数,记为left和right,如果left等于right,则返回left
     * 如果left不等于right,则left和right都是最终结果的候选,此时需要遍历整个数组考察left和right出现的次数,出现次数较多的就是最终返回的结果。
     *
     * @param nums
     * @return
     */
    public int majorityElement_3(int[] nums) {
        return find(nums, 0, nums.length - 1);
    }
    public int find(int[] nums, int begin, int end) {
        if (begin == end) {
            return nums[begin];
        } else {
            int mid = (begin + end) / 2;
            int left = find(nums, begin, mid);
            int right = find(nums, mid + 1, end);
            //左右两部分的众数相同 则这个数是这部分的众数
            if (left == right) {
                return left;
            } else {
                //左右两部分的众数不相同 则这两个数都有可能是这部分的众数,那么遍历这个数组,看一下哪个数字的出现次数多
                int countLeft = 0;
                int countRight = 0;
                for (int i = begin; i <= end; i++) {
                    if (nums[i] == left) {
                        countLeft++;
                    } else if (nums[i] == right) {
                        countRight++;
                    }
                }
                if (countLeft > countRight) {
                    return left;
                } else {
                    return right;
                }
            }
        }
    }
    /**
     * 摩尔投票算法,先将第一个数字假设为众数,然后把计数器设为1,比较下一个数和此数是否相等,若相等则计数器加一,反之减一。
     * 然后看此时计数器的值,若为零,则将当前值设为候选众数。以此类推直到遍历完整个数组,当前候选众数即为该数组的众数。
     *
     * @param nums
     * @return
     */
    public int majorityElement_4(int[] nums) {
        int maj = nums[0];
        int count = 1;
        for (int num : nums) {
            if (maj == num) {
                count++;
            } else {
                count--;
                if (count == 0) {
                    maj = num;
                    count = 1;
                }
            }
        }
        return maj;
    }
}
Leetcode#169. Majority Element(求众数)的更多相关文章
- LeetCode 169. Majority Element (众数)
		Given an array of size n, find the majority element. The majority element is the element that appear ... 
- ✡   leetcode   169. Majority Element  求出现次数最多的数  --------- java
		Given an array of size n, find the majority element. The majority element is the element that appear ... 
- 169. Majority Element求众数
		网址:https://leetcode.com/problems/majority-element/ 参考:https://blog.csdn.net/u014248127/article/detai ... 
- 169 Majority Element 求众数 数组中出现次数超过一半的数字
		给定一个大小为 n 的数组,找到其中的众数.众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素.你可以假设数组是非空的,并且数组中的众数永远存在. 详见:https://leetcode.com/p ... 
- leetcode 169. Majority Element 、229. Majority Element II
		169. Majority Element 求超过数组个数一半的数 可以使用hash解决,时间复杂度为O(n),但空间复杂度也为O(n) class Solution { public: int ma ... 
- 23. leetcode 169. Majority Element
		169. Majority Element Given an array of size n, find the majority element. The majority element is t ... 
- [LeetCode] 169. Majority Element 多数元素
		Given an array of size n, find the majority element. The majority element is the element that appear ... 
- [LeetCode] Majority Element  求众数
		Given an array of size n, find the majority element. The majority element is the element that appear ... 
- LeetCode 169. Majority Element - majority vote algorithm (Java)
		1. 题目描述Description Link: https://leetcode.com/problems/majority-element/description/ Given an array ... 
随机推荐
- 每添加一张图片后,GDI对象 + 3 原因: ImageList_AddIcon(hIcon) 后没调用 DestroyIcon(hIcon)
			今天无意间在[任务管理器]中发现,每添加1张图片后,应用程序的 GDI对象 + 3,添加图片后,再把所有图片删除, GDI对象数量没减少! 排查原因,发现: GDI对象 + 3 的代码是: int o ... 
- request 对于cookie,session, json的处理
			一.cookie是存放在客户端,session是存放在服务端. 因为http是无状态的,当客户端发送请求给服务端的时候,服务端为了区分下一次发送请求的是不是同一个客户,那么就需要用一种方式记录下这个客 ... 
- IDEA和WebStorm破解教程--激活n年(随时更新)
			首先,打开蓝雨的官网--->http://idea.lanyus.com/,找到这个jar包 之后,去官网下载IDEA--->https://www.jetbrains.com/idea ... 
- 如何把dedecms数据生成json
			最近搞dede搞得头大,长话短说! 名称:json数据调用 功能:调用某个远程连接的json接口,方便同远程站点之间进行通信来调取内容 语法: {dede:json url='http://news/ ... 
- Django+Uwsgi+Nginx
			一.数据库准备 yum install mariadb-server -y systemctl start mariadb 监听端口 netstat -lntup mysql 进入 grant ... 
- 谈.Net委托与线程——创建无阻塞的异步调用(二)
			了解IAsyncResult 现在我们已经了解,EndInvoke可以给我们提供传出参数与更新后的ref参数:也可以向我们导出异步函数中的异常信息.例如,我们使用BeginInvoke调用了异步函数S ... 
- 定时任务调度-Celery
			确保任务不重叠解决方法: from celery import task from celery.five import monotonic from celery.utils.log import ... 
- MySQL内存占用计算
			##MySQL 最大可使用内存( M ): SELECT ( @@key_buffer_size + @@innodb_buffer_pool_size + @@query_cache_size + ... 
- 【.NET】VS 本地调试 无法加载Json文件
			1.如果要是发布到iis,还加载不出来,那就要配置一下MIME类型: 2.本地调试时,无法加载json文件: 解决方案: 在web.config中添加如下配置:mimeMap <system.w ... 
- Android面试基础(一)IOC(DI)框架(ViewUtils)讲解_反射和自定义注解类
			1. Android中的IOC(DI)框架 1.1 ViewUtils简介(xUtils中的四大部分之一) IOC: Inverse of Controller 控制反转. DI: Dependenc ... 
