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

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

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

猜你喜欢

转载自www.cnblogs.com/c-supreme/p/9564580.html