数组之找出Array中出现次数超过一半的数

    xiaoxiao2021-04-12  29

    /*********数组之找出Array中出现次数超过一般的数,假设数组乱序;***********/ /***************************************************************************************************************************************************************/ //方法一:利用hash表;数组无需排序;建立一个Hash_map;其中key为数组元素的值,value为次数出现的次数; // 遍历一遍数组,用hash_map统计每个数出现的次数,并用两个值存储目前出现次数最多的数及对应的次数; // 时间复杂为O(n),空间复杂度为O(n); //关联性容容器map的特性之一:所有元素会根据元素的键值自动被排序;map不允许两个元素拥有相同的键值; //此方法同上题《找出数组中重复次数最多的数》 #include<iostream> #include<vector> #include<map> using namespace std; int findMoreThanHalfNum(vector<int> &nums) { map<int,int> maping; int len=nums.size(); int mostCount=1; int mostNum=nums[0]; for(int i=0;i<len;i++) { maping[nums[i]]++; if(maping[nums[i]]>mostCount) { mostCount=maping[nums[i]]; mostNum=nums[i]; } } return mostNum; } int main() { int A[]={1,1,1,1,2,4,4,4,4,4,4,4,4,5}; int len=(sizeof(A)/sizeof(A[0])); vector<int> nums(A,A+len); int mostNum=findMoreThanHalfNum(nums); cout<<mostNum<<endl; system("pause"); return 0; } /********************************************************************************************************************************************************************/ //方法二:先对数组排序,利用数组特性,数组中有一个数字出现的次数超过了数组长度的一半, //则数组中间的数(即中位数)为所求;最快的排序算法时间复杂度为O(nlogn); /*******************************************************************************************************************************************************************/ //方法三:利用数组特性:数组中有一个数字出现的次数超过了数组长度的一半,即该数出现的次数比其他所有数出现的次数的和还要大; // 遍历数组,保存两个值,一个存储数组中的一个数字,一个存储次数;当我们遍历下一个数字时,若下一个数字与之前保存的 // 的数字相同,则次数加1;如果数字和之前保存的数字不同,则次数减-1,;如果次数为0,需要保存下一个数字,并把次数设为1; // 因为要找的数出现的次数比其他所有数出现的次数的和还要多,则要找的数字肯定是最后一次把次数设为1时对应的数字; int findMoreThanHalfNum(int *nums,int len) { if(nums==nullptr||len<=0) return -1; int findNum=nums[0]; int count=1; for(int i=1;i<len;i++) { if(count==0) { findNum=nums[i]; count=1; } else if(nums[i]==findNum) count++; else count--; } return findNum; }
    转载请注明原文地址: https://ju.6miu.com/read-667939.html

    最新回复(0)