C++ 在数组中查找多数元素(对于具有长整数输入的特定情况,获取错误的输出)
我正在解决一个多数元素的问题,在这个问题中,我将得到一个int'n',后跟一个大小为n的数组作为输入。如果数组中任何元素的频率大于n/2,则返回1,否则返回0。现在,我的程序可以正确地处理整型元素的小值,但对于较大的int值,它会给出错误的输出 以下是源代码C++ 在数组中查找多数元素(对于具有长整数输入的特定情况,获取错误的输出),c++,output,C++,Output,我正在解决一个多数元素的问题,在这个问题中,我将得到一个int'n',后跟一个大小为n的数组作为输入。如果数组中任何元素的频率大于n/2,则返回1,否则返回0。现在,我的程序可以正确地处理整型元素的小值,但对于较大的int值,它会给出错误的输出 以下是源代码 #include <algorithm> #include <iostream> #include <vector> using std::vector; int get_majority_eleme
#include <algorithm>
#include <iostream>
#include <vector>
using std::vector;
int get_majority_element(vector<int> &a) {
int count{};
std::sort(a.begin(),a.end());
for( size_t i{}; i<a.size() ; ++i ){ //counter
for( size_t j = i+1 ; j<a.size() ; ++j ){
if( a.at(i) == a.at(j) ){
count += 1; // may have to inclue a count nullifier if two elements are repeated
}
}
}
if( count > ( a.size()/2 ) ){
return 1;
}
else {
return 0;
}
}
int main() {
int n;
std::cin >> n;
vector<int> a(n);
for (size_t i = 0; i < a.size(); ++i) {
std::cin >> a.at(i);
}
std::cout << get_majority_element(a) << '\n';
return 0;
}
#包括
#包括
#包括
使用std::vector;
int get_多数元素(向量&a){
整数计数{};
排序(a.begin(),a.end());
对于(size_t i{};i>n;
向量a(n);
对于(大小i=0;i>a.at(i);
}
std::cout和你一样
- 您不需要
std::sort
- 您需要重置
计数
- 检查应在外回路中进行
复杂性:O(n)
关于信息,还有一种算法可以线性执行,包括找到可能的候选对象,然后检查它。谢谢,我真的很感激你的算法,但现在的问题是我不明白我的代码有什么问题?如果我必须更改代码,那么我应该先了解我的错误。如果你能帮助我,那就太好了那:)在你的算法中,count
应该代表什么?它实际计算的是什么?count计算一个元素被重复的次数,或者说数组中元素的频率。这是你期望的。但是你计算整个向量的count
(不重置它),所以你计算所有相等的对。{1,1,2,2}
的结果是2。而你期望的是1然后0,然后1然后0。@SudhanshuShekhar你很幸运你的前两次试验都能成功,因为它们实际上相当于2+1
和3+2+1
。而你的第三次试验实际上是4+3+2+1
bool get_majority_element(const vector<int> &a) {
for (size_t i{}; i < a.size() ; ++i) {
int count{};
for (size_t j = i+1 ; j<a.size() ; ++j) {
if (a.at(i) == a.at(j)){
count += 1;
}
}
if (count > ( a.size()/2 )) {
return true;
}
}
return false;
}
bool get_majority_element(const vector<int> &a) {
for (size_t i{}; i < a.size() ; ++i) {
if (std::count(a.begin() + i, a.end(), a[i]) > a.size() / 2) {
return true;
}
}
return false;
}
bool get_majority_element(vector<int> &a) {
std::sort(a.begin(), a.end());
for (auto it = a.begin(); it != a.end(); /*empty*/) {
auto next = std::find_if(it, a.end(), [&](int n){ return n != *it; });
if (std::distance(it, next) > a.size() / 2) {
return true;
}
it = next;
}
return false;
}