Leetcode 169.多数元素

前言

这篇文章会给大家提供Leetcode 169.多数元素详细的代码以及解题思路来让大家更好的理解这道题目,记住我们的口号是“刷题使我快乐”。


一、题目描述与分析

题目链接: Leetcode 169.多数元素

题目描述:
给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 【n/2】的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。

题目给我们提供了一个数组,并且有一个多数元素的概念。多数元素就是该元素在给定数组里面出现次数在一半以上,这样的元素被称为多数元素。并且这里告诉我们给到的数组一定是非空的,并且一定会出现多数元素


二、题解以及代码

1、投票算法
投票算法,顾名思义就和投票的过程差不多,你可以选择给一个人投支持或者反对;有人给你投支持就有人给你投反对,投支持就给你加分,反对就给你减分,最后谁得的分数高谁就是被选中的人。
具体在这个题目中就是:如果这个数字出现就给他的次数加一反之就减一,如果count变为0就说明之前的数字不是多数元素,就更新flag的值,如此遍历完数组后就可以保证flag一定是多数元素,将flag返回就可以。

时间复杂度:O(n)
空间复杂度:O(1)

int majorityElement(int* nums, int numsSize) {
    int flag = nums[0],count = 0;
    for(int i = 0;i < numsSize; i++){
        if(count == 0){
            flag = nums[i];
        }
        count += (nums[i] == flag)? 1 : -1;
    }
    return flag;
}
class Solution {
    public int majorityElement(int[] nums) {
        int count = 0,flag = nums[0];
        for(int num : nums){
            if(count == 0){
                flag = num;
            }
            count += (num == flag)? 1: -1;
        }
        return flag;
    }
}

2、排序
先给数组排序然后输出下标为 n/2 的元素,这个元素一定是多数元素,因为多数元素一定是出现次数大于数组的一半的。

int compare(const void *a, const void *b) {
    return *(int*)a - *(int*)b;
}

int majorityElement(int* nums, int numsSize) {
    qsort(nums, numsSize, sizeof(int), compare);
    return nums[numsSize / 2];
}
class Solution {
    public int majorityElement(int[] nums) {
        Arrays.sort(nums);
        return nums[nums.length/2];
    }
}

3、哈希表方法
利用Java里面的哈希表来存储数据:key 为值, value 为出现的次数。
然后遍历哈希表来找到大于 n/2value ,此时 value 就是多数元素。

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

总结

这篇文章为大家提供了LeetCode 163.多数元素 的题目解析,一共用了三种不同的方法,分别是投票算法、哈希表、排序方法。他们的时间复杂度各有优劣,大家可以选择喜欢的方法使用。

那么今天的文章到这里就结束了,希望博主写的文章对大家有帮助,如果有什么问题的话可以在评论区提出,或者私信博主,欢迎大家提出问题来一起交流。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值