LeetCode Array Easy169. Majority Element

 Description

 

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.

Example 1:

Input: [3,2,3]
Output: 3

Example 2:

Input: [2,2,1,1,1,2,2]
Output: 2

 问题描述: 给定一个非空数组,找到出现次数最多的元素 超过N/2次

思路: 用最简单粗暴的方法,遍历数组,将每个元素出现的次数和元素作为键值对的形式保存起来,最后再遍历键值对,找出出现次数最多的元素。

代码:

public static int MajorityElement(int[] nums)
        {
            Dictionary<int, int> dics = new Dictionary<int, int>();
            int result = int.MinValue;
            int maxCount = 0;
            for (int i = 0; i < nums.Length; i++)
            {
                if(dics.ContainsKey(nums[i]))
                {
                    dics[nums[i]] = dics[nums[i]] + 1;
                }
                else
                {
                    dics.Add(nums[i], 1);
                }
            }
            foreach (KeyValuePair<int,int> item in dics)
            {
                if (item.Value > maxCount)
                {
                    result = item.Key;
                    maxCount = item.Value;
                }
                    
            }
            return result;
        }

 

 

 

但是这种解法用到的键值对,思考是否有更好的解法,看了别人的解法。更为简单和简洁。思路就是假设第一个元素为多数元素,遍历数组,如果下一个元素和多数元素相同,则数量加一,如果不想等,数量减一,如果count==0 则修改多数元素为当前元素。

下面是代码。

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

这种解法是在给定数组中元素只有两个值。 如果出现三个值就不可以了

但是题目并未给出这个条件,只是在实例中体现出来了。

转载于:https://www.cnblogs.com/c-supreme/p/9564580.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值