p20 数组中超过一半的数字 (leetcode 46)

一:解题思路

这道题目,有2种方法可以解决。第一种方法:循环遍历一遍数组,利用一个哈希表记录每个数字出现的次数,然后返回次数最多的那个数字。这个方法遍历了一遍数组时间复杂度为:O(n),用了一个哈希表,空间复杂度为:O(n)。

第二种方法:利用摩尔投票法。

二:完整代码示例 (C++版和Java版)

第一种方法:C++

 class Solution 
 {
 public:
     int majorityElement(vector<int>& nums) 
     {
         map<int, int> hash_map;
         int maxValue = 0, maxCount = 0;

         for (int i = 0; i < nums.size(); i++)
         {
             int newCount=hash_map[nums[i]] + 1;
             hash_map[nums[i]] = newCount;

             if (newCount > maxCount)
             {
                 maxCount = newCount;
                 maxValue = nums[i];
             }
         }

         return maxValue;
     }
 };

第一种方法:Java

class Solution
{
    public int majorityElement(int[] nums)
    {
           int maxValue=0,maxCount=0;

           Map<Integer,Integer> hash_map=new HashMap<>();
           
           for(int i=0;i<nums.length;i++)
           {
               int newCount=hash_map.getOrDefault(nums[i],0)+1;
               hash_map.put(nums[i],newCount);
               
               if(newCount>maxCount)
               {
                   maxCount=newCount;
                   maxValue=nums[i];
               }
           }

           return maxValue;
    }
}

第二种方法:C++

 class Solution 
 {
 public:
     int majorityElement(vector<int>& nums) 
     {
         int num = nums[0], count = 1;

         for (int i = 1; i < nums.size(); i++)
         {
             if (count == 0)
             {
                 num = nums[i];
                 count = 1;
             }
             else if (nums[i] == num)
             {
                 count++;
             }
             else
             {
                 count--;
             }
         }

         return num;
     }
 };

第二种方法:Java

class Solution 
{
    public int majorityElement(int[] nums) 
    {
          int num=nums[0],count=1;
          
          for(int i=1;i<nums.length;i++)
          {
              if(count==0)
              {
                  num=nums[i];
                  count=1;
              }
              else if(num==nums[i])
              {
                  count++;
              }
              else
              {
                  count--;
              }
          }
          
          return num;
    }
}

 

上一篇:LeetCode 46. 全排列


下一篇:leetcode(46)- 全排列