zoukankan      html  css  js  c++  java
  • 腾讯//求众数

    给定一个大小为 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。

    你可以假设数组是非空的,并且给定的数组总是存在众数。

    示例 1:

    输入: [3,2,3]
    输出: 3

    示例 2:

    输入: [2,2,1,1,1,2,2]
    输出: 2
    class Solution {
    public:
        int majorityElement(vector<int>& nums) {
            if(nums.size()==1)
                return nums[0];
            map<int,int> tables;
            for(int i = 0; i < nums.size(); i++){
                if(tables.count(nums[i])){
                    tables[nums[i]]++;
                    if(tables[nums[i]]>nums.size()/2)
                              return nums[i];
                }else{
                    tables[nums[i]] = 1;
                }
            }
        }
    };
    class Solution {
        // 众数求解算法
        public int majorityElement(int[] nums) {
            // 黑板(用于记录数据用)
            LinkedHashMap<Integer, Integer> blackboard = new LinkedHashMap<>();
            // 左边记录到的位置
            int leftPs = 0;
            // 右边记录到的位置
            int rightPs = nums.length - 1;
            // 众数
            Integer mode = null;
    
            tag: while (leftPs <= rightPs) {
                for (int i = leftPs; i <= rightPs; i++) {
                    if (blackboard.get(nums[i]) == null) {
                        blackboard.put(nums[i], 1);
                        leftPs = i + 1;
                        if (leftPs > rightPs) {
                            mode = nums[i];
                        }
                        break;
                    } else {
                        int count = blackboard.get(nums[i]);
                        count++;
                        if (count>nums.length/2) {
                            mode = nums[i];
                            break tag;
                        }
                        blackboard.put(nums[i], count);
                    }
                }
                for (int i = rightPs; i >= leftPs; i--) {
                    if (blackboard.get(nums[i]) == null) {
                        blackboard.put(nums[i], 1);
                        rightPs = i - 1;
                        if (rightPs < leftPs) {
                            mode = nums[i];
                        }
                        break;
                    } else {
                        int count = blackboard.get(nums[i]);
                        count++;
                        if (count>nums.length/2) {
                            mode = nums[i];
                            break tag;
                        }
                        blackboard.put(nums[i], count);
                    }
                }
            }
            return mode;
        }
    }
  • 相关阅读:
    linux——进程管理
    linux——软件管理
    linux——压缩打包
    linux——输入输出
    linux——ACL控制
    linux——特殊权限
    linux——基本权限
    linux——用户管理
    单源最短路spfa(队列优化)
    getline读取
  • 原文地址:https://www.cnblogs.com/strawqqhat/p/10602482.html
Copyright © 2011-2022 走看看