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)
版权声明:本页面内容旨在传播知识,为用户自行发布,若有侵权等问题请及时与本网联系,我们将第一时间处理。E-mail:284563525@qq.com