数组中出现次数超过一半的数字-C++-Map法

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

http://www.nowcoder.com/questionTerminal/e8a1b01a2df14cb2b228b30ee6a92163

由于输入的数组中元素大小范围未知,故最开始的思路是考虑采用一个超大数组num[1024]来记录各元素的个数的方法不合适。继续思考以下的思路:构建map<int,int>(元素值,元素个数)。
具体的算法思路为:

  1. 若输入的元素个数为0,则不存在返回0;

  2. 若输入的元素个数为1,则返回number[0];

  3. 从前向后遍历numbers数组:
    如果map容器中未找到当前元素numbers[i],则将当前元素numbers[i],和元素个数1插入到map容器中;
    make_pair(numbers[i],1);

  4. 若找到numbers[i],则取出numbers[i]元素的个数,并将当前元素个数+1,
    如果当前元素个数大于数组长度的一半,则返回当前元素;
    否则,先删除map容器中的numbers[i],再插入到容器中 make_pair(numbers[i],count)

  5. 未找到满足要求的元素,末尾返回0
    具体代码实现:

    class Solution {
    public:
     int MoreThanHalfNum_Solution(vector<int> numbers) {
         int numbers_size=numbers.size();
         if(numbers_size == 0){
             return 0;
         }
         if(numbers_size == 1){
             return numbers[0];
         }
         int halfValue=numbers_size/2;
         int result=0;
         map<int,int> num_map;
         for(int i=0; i<numbers_size; i++){
             if(num_map.find(numbers[i]) == num_map.end()){
                 num_map.insert(make_pair(numbers[i],1));
             }
             else{
                 int count=num_map[numbers[i]];
                 count++;
                 //若当前数字出现次数超过数组长度的一半,则break
                 if(count > halfValue){
                     result=numbers[i];
                     return result;
                 }
                 num_map.erase(numbers[i]);
                 num_map.insert(make_pair(numbers[i],count));
             }
    
         }
         return result;
     }
    };
全部评论

相关推荐

10-15 10:57
已编辑
武昌理工学院 FPGA工程师
狠赚笔第一人:老哥学院本没实习还想拿13k学Java狠赚笔呢
点赞 评论 收藏
分享
10-07 23:57
已编辑
电子科技大学 Java
八街九陌:博士?客户端?开发?啊?
点赞 评论 收藏
分享
11-27 12:43
已编辑
门头沟学院 C++
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务