题目描述
简述:找出非降序数组中出现次数大于25%的数组元素
思路
方法1
1、遍历一次整个数组元素
2、遇到不同元素,则计算下标之差,记录满足元素个数够25%的数组下标
3、下标差大于25%数组则返回
4、下标差不大于25%继续遍历
方法1代码及运行结果
class Solution {
public:
int findSpecialInteger(vector<int>& arr) {
int length = arr.size(); //获取数组长度
int n = length/4,tag = 0,temp = -1; //tag存放上次不同元素下标,temp存放元素够25%的元素下标
for(int i = 0; i < length; i++){//遍历数组
if(arr[i] != arr[tag]){ //遇到不同的元素
if( (i-tag) > n ){ //tag下标的元素个数够25%
temp = tag; //temp记录满足个数够25%的数组元素下标
break;
}
tag = i;//tag下标元素不够25%,把当前不同的i下标元素赋值给tag
}
}//for
if ( temp < 0 )
temp = length-1;//所有元素相同时
return arr[temp];
}
};
方法2
1、遍历一次数组
2、若两数组元素满足相隔超过25%数组长度且相等,即为所求
方法2代码及运行结果
class Solution {
public:
int findSpecialInteger(vector<int>& arr) {
int len = arr.size() / 4; //四分之一数组长度
for (int i=0;i<arr.size();i++) {
if (arr[i] == arr[i+len]) { //跨越超过四分之一长度的两数组元素相等
return arr[i];
}
}
return 0;
}
};
时间复杂度与方法1虽同为O(n),但是可以明显看到运行时间比较少