每日一道算法---数组中出现次数超过一半的数字

数组中出现次数超过一半的数字

  • 1.题目
  • 2.思路
  • 3.代码

1.题目

链接: 数组中出现次数超过一半的数字
每日一道算法---数组中出现次数超过一半的数字_第1张图片

2.思路

【解题思路1】:
思路一:数组排序后,如果符合条件的数存在,则一定是数组中间那个数。这种方法虽然容易理解,但由于
涉及到快排sort,其时间复杂度为O(NlogN)并非最优;

【解题思路2】:
众数:就是出现次数超过数组长度一半的那个数字
如果两个数不相等,就消去这两个数,最坏情况下,每次消去一个众数和一个非众数,那么如果存在众数,
最后留下的数肯定是众数

3.代码

#include 
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param numbers int整型vector
     * @return int整型
     */
    int MoreThanHalfNum_Solution(vector<int>& numbers) {
        // write code here

        //解法1
        /* int size=numbers.size();
         sort( numbers.begin(), numbers.end());
         if(size>1)
         return numbers[size/2];
         else
          return numbers[0];*/

        
                if (numbers.empty()) return 0;
// 遍历每个元素,并记录次数;若与前一个元素相同,则次数加1,否则次数减1
         
                int result = numbers[0];
                int times = 1; // 次数
                for (int i = 1; i < numbers.size(); ++i) {
                    if (times != 0) {
                        if (numbers[i] == result) {
                            ++times;
                        } else {
                            --times;
                        }
                    } else {
                        result = numbers[i];
                        times = 1;
                    }
                }
// 判断result是否符合条件,即出现次数大于数组长度的一半
                times = 0;
                for (int i = 0; i < numbers.size(); ++i) {
                    if (numbers[i] == result) ++times;
                }
                return (times > numbers.size() / 2) ? result : 0;
            }
        };


你可能感兴趣的:(C++方向算法题目,算法,c++,开发语言)