LeetCode之169. 多数元素

概要

题目来源链接:https://leetcode-cn.com/problems/majority-element/

难度:简单

类型:链表

题目

给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例

示例 1:

输入: [3,2,3]
输出: 3
示例 2:

输入: [2,2,1,1,1,2,2]
输出: 2

分析

第一种思路是,计算数组中每个元素的重复次数,然后判断该元素的重复次数是否大于n/2,如果大于的话则是多数元素。

第二种思路是,不同于第一种思路的高时间复杂度,这种思路只循环遍历一次数组,先将数组排序后,统计每个元素的出现次数,然后判断是否大于n/2,来决定是否是多数元素。

第三种思路是利用消除的思想,消除其他元素,最后剩下的一个元素即是所需要的。

也就是摩尔投票法,可以参考下官方的题解。

LeetCode之169. 多数元素_第1张图片

第四种思路,将数组排序后,大于n/2的元素一定在数组的中间位置。

LeetCode之169. 多数元素_第2张图片

代码

Java代码

第一种思路

    /* 第一种算法 */
    public int majorityElement(int[] nums) {
        for (int i = 0; i < nums.length; i++) {
            int count=0;// 计数器,记录每个元素的出现次数
            for (int j = 0; j < nums.length; j++) {
                if(nums[i]==nums[j]){
                    count++;
                }
            }
            // 判断该元素的是否是主元素,即count>length/2
            if(count>nums.length/2){
                return nums[i];// 然后返回该元素
            }
        }
        return -1;
    }

第二种思路

    /* 第二种算法 */
    public int majorityElement(int[] nums){
        Arrays.sort(nums);// 首先将数组进行排序,调用的是Java的函数
        // 之所以要先将数组排序,是因为排序后重复元素是相邻的,便于统计
        int temp=nums[0];// 作为基准数
        int count=0;// 计数器,统计每个数的出现次数
        for(int i=0;inums.length/2){// 然后判断计数器是否大于n/2,如果大于的话则是多数元素
                    return nums[i];
                }
            }else {// 如果不等于的话则
                temp=nums[i];// 将基准数temp置为新的元素
                count=1;// 然后将计数器重置
            }
        }
        return -1;
    }

第三种思路

    /* 第三种算法 */
    public int majorityElement(int[] nums){
        int temp=nums[0];// 基准数
        int count=0;// 计数器
        for (int i = 0; i < nums.length; i++) {// 循环遍历数组中的每个元素
            if(nums[i]==temp){// 如果数组中的元素等于基准数
                count++;// 则计数器加1
            }else {
                count--;// 计数器减1
            }
            if(count<0){// 判断计数器是否小于0
                temp=nums[i];// 将temp置为nums[i]
                count=0;// 并且count置为0
            }
        }
        return temp;
    }

第四种思路

    public int majorityElement(int[] nums) {
        Arrays.sort(nums);// 将数组排序
        int major=nums[(int)nums.length/2];// 那么大于n/2的元素一定在数组中间
        return major;
    }

完整代码如下:

import java.util.Arrays;

class Solution {

    public int majorityElement(int[] nums) {
        Arrays.sort(nums);// 将数组排序
        int major=nums[(int)nums.length/2];// 那么大于n/2的元素一定在数组中间
        return major;
    }

    public static void main(String[] args) {
        int[] nums = new int[]{2, 2, 1, 1, 1, 2, 2};
        System.out.println(new Solution().majorityElement(nums));
    }
}

 

你可能感兴趣的:(#,LeetCode)