C++程序 在已排序的数组中检查多数元素

C++程序 在已排序的数组中检查多数元素

问题: 编写一个函数来查找给定整数x是否出现在n个整数的已排序数组中超过n/2次。

基本上,我们需要编写一个函数,称为isMajority(),它将一个数组(arr[]),一个数组的大小(n)和要搜索的数字(x)作为参数,并在x出现超过n/2次时返回true。

例子:

输入:arr[] = {1, 2, 3, 3, 3, 3, 10},x = 3
输出:True(在给定的数组中x出现的次数超过n/2)

输入:arr[] = {1, 1, 2, 4, 4, 4, 6, 6},x = 4
输出:False(在给定的数组中x没有出现超过n/2次)

输入:arr[] = {1, 1, 1, 2, 2},x = 1
输出:True(在给定的数组中x出现的次数超过n/2)

METHOD 1 (Using Linear Search)

线性搜索元素的第一次出现,查找到它(假设在索引i),检查在索引i + n/2处的元素。如果在i+n/2处存在元素则返回1,否则返回0。

/* C++程序检查已排序数组中的多数元素 */
#include<bits/stdc++.h>
using namespace std;
 
bool isMajority(int arr[], int n, int x)
{
    int i;
 
    /* 根据n(偶数或奇数)获取最后一个索引 */
    int last_index = n % 2 ? (n / 2 + 1): (n / 2);
 
    /* 在arr[]中搜索x的第一次出现*/
    for (i = 0; i < last_index; i++)
    {
       
        /* 检查是否存在x并且出现次数超过n/2
        次 */
        if (arr[i] == x && arr[i + n / 2] == x)
            return 1;
    }
    return 0;
}
 
/* 驱动程序 */
int main()
{
    int arr[] ={1, 2, 3, 4, 4, 4, 4};
    int n = sizeof(arr)/sizeof(arr[0]);
    int x = 4;
    if (isMajority(arr, n, x))
        cout <<    x <<" appears more than "<<
                              n/2 << " times in arr[]"<< endl;
    else
        cout <<x <<" does not appear more than" << n/2 <<"  times in arr[]" << endl;
 
return 0;
}
 
// 此代码由shivanisinghss2110贡献```  

输出:

4 appears more than 3 times in arr[]

时间复杂度: O(n)

辅助空间: O(1)

因为使用的是常量额外的空间。

METHOD 2 (Using Binary Search)

使用二进制搜索方法找到给定数字的第一次出现。这里二进制搜索的条件很重要。

// C ++程序检查已排序数组中的多数元素
#include 
using namespace std;

//如果在arr [low…high]中存在x
//则返回x的第一个出现的索引,否则返回-1
int _binarySearch(int arr [],int low,
                 int high,int x);

//如果x在大小为n的arr []中
//出现次数超过n / 2,则返回true
bool isMajority(int arr [],int n,int x)
{
    //在arr []中找到x的第一个出现的索引
    int i = _binarySearch(arr,0,n-1,x);

    //如果元素根本不存在,则返回false
    if(i == -1)
        返回false;

    //检查该元素是否存在
    //超过n / 2次
    if(((i + n / 2)<=(n-1))&&
      arr [i + n / 2] == x)
        返回true;
    其他
        返回false;
}

//如果在arr [low…high]中存在x,则返回x的第一个出现的索引,否则返回-1
int _binarySearch(int arr [],int low,
                 int high,int x)
{
    if(high> = low)
    {
        int mid =(low + high)/ 2; / * low +(high-low)/ 2; * /

        / *如果x是以下内容之一,则检查arr [mid]是否为x的第一个出现。
            arr [mid]是第一次出现,如果x是以下内容之一:
            (i)mid == 0且arr [mid] == x
            (ii)arr [mid-1]  arr [mid-1])&&
            (arr [mid] == x))
            返回中间;
            
        else if(x> arr [mid])
            返回_binarySearch(arr,(mid + 1),
                                 high,x);
        其他
            返回_binarySearch(arr,low,
                                (中-1),x);
    }
    返回-1;
}

//驱动程序代码
int main()
{
    int arr [] = {1,2,3,3,3,3,10};
    int n = sizeof(arr)/ sizeof(arr [0]);
    int x = 3;

    如果(isMajority(arr,n,x))
        cout << x <<“出现超过”
             << n / 2 <<“次在arr []中”
             << endl;
    其他
        cout << x <<“不出现超过”
             << n / 2 <<“次在arr []中”<< endl;

    回来0;
}

//此代码由shivanisinghss2110提供```  

输出:

3出现超过3次在arr []中

时间复杂度: O(对数n)

辅助空间: O(1)

由于使用了常量额外空间。

算法范式: 分治

方法3: 如果已经给出数组已排序且存在多数元素,则检查特定元素是否与检查的中间元素相同。

因为多数元素在数组中出现次数超过n / 2次,所以它将始终是中间元素。我们可以使用这个逻辑检查给定的数字是否是多数元素。

#include 
using namespace std;

bool isMajorityElement(int arr[], int n, int key)
{
    if (arr[n / 2] == key)
        return true;
    else
        return false;
}

int main()
{
    int arr[] = {1, 2, 3, 3, 3, 3, 10};
    int n = sizeof(arr) / sizeof(arr[0]);
    int x = 3;
    if (isMajorityElement(arr, n, x))
        cout << x << "出现超过"
             << n / 2 << "次在arr []中"
             << endl;
    else
        cout << x << "不出现超过"
             << n / 2 << "次在arr []中" << endl;

    return 0;
}

//此代码由shivanisinghss2110提供```  

输出

arr[]中出现3的次数超过了3次

时间复杂度 : O(1)

辅助空间: O(1)

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

C++ 示例