📜  C++ 计算有序数组的众数 - C++ (1)

📅  最后修改于: 2023-12-03 15:14:01.701000             🧑  作者: Mango

C++ 计算有序数组的众数

本文介绍了如何使用 C++ 编程语言来计算一个有序数组的众数。众数是指在数组中出现次数最多的数字。

算法概述

为了计算有序数组的众数,我们可以使用一种简单而高效的算法,称为「二分查找法」。该算法的基本思想是在数组中查找目标数字的起始位置和结束位置,然后根据这两个位置计算出该数字在数组中出现的次数。

具体步骤如下:

  1. 通过二分查找找到目标数字在数组中第一次出现的位置,记为 start
  2. 通过二分查找找到目标数字在数组中最后一次出现的位置,记为 end
  3. 计算众数出现的次数,即 end - start + 1
  4. 如果该次数大于数组长度的一半,那么该目标数字即为众数。
  5. 如果该次数小于等于数组长度的一半,则继续搜索下一个数字。

根据上述算法,我们可以使用循环来找到所有众数。

C++ 代码示例
#include <iostream>
#include <vector>

using namespace std;

// 二分查找目标数字第一次出现的位置
int findFirst(vector<int>& nums, int target) {
    int left = 0;
    int right = nums.size() - 1;

    while (left < right) {
        int mid = left + (right - left) / 2;

        if (nums[mid] < target) {
            left = mid + 1;
        } else {
            right = mid;
        }
    }

    return left;
}

// 二分查找目标数字最后一次出现的位置
int findLast(vector<int>& nums, int target) {
    int left = 0;
    int right = nums.size() - 1;

    while (left < right) {
        int mid = left + (right - left + 1) / 2;

        if (nums[mid] > target) {
            right = mid - 1;
        } else {
            left = mid;
        }
    }

    return left;
}

// 计算有序数组的众数
vector<int> findMode(vector<int>& nums) {
    vector<int> modes;
    
    int n = nums.size();
    int count = 1;

    for (int i = 0; i < n; i++) {
        int start = findFirst(nums, nums[i]);
        int end = findLast(nums, nums[i]);

        count = end - start + 1;

        if (count > n / 2) {
            modes.push_back(nums[i]);
        }
    }

    return modes;
}

int main() {
    vector<int> nums = {1, 2, 2, 2, 3, 4, 4, 5, 5, 5};
    
    vector<int> modes = findMode(nums);
    
    cout << "众数: ";
    for (int i = 0; i < modes.size(); i++) {
        cout << modes[i] << " ";
    }
    
    return 0;
}

上述代码示例中,我们先定义了 findFirst()findLast() 两个函数来实现二分查找的功能。然后,通过 findMode() 函数来计算有序数组的众数。最后,在 main() 函数中调用 findMode() 来输出众数。

以上就是用 C++ 编程语言计算有序数组众数的方法和代码示例。你可以根据自己的实际需求修改代码,并且可以通过此方法来计算其他类型的众数。希望本文对你有所帮助!