您的位置:首页 > 其它

数组中出现次数超过一半的数字

2017-05-30 10:15 281 查看


《剑指Offer》P163

题目:找出数组中一个出现次数超过整个数组长度一般的数字

解法一:将原问题转化为求数组的中位数,採用高速排序的思想,每一次Partition取末位为哨兵,遍历将小于、大于哨兵的数分别移至哨兵左右,最后返回哨兵在处理后的数组中的位置。不断缩小要处理的数组的长度大小。终于确定返回值为数组长度一半的元素。即为中位数。

解法二:因为题设该数字出现的次数大于其它全部数字出现的次数。故用两个变量,一个表示数字num_data,一个表示次数。当下一个数字等于num_data时。则times加1。如若不等于,time减1。直至times等于0,则将num_data更换为下一个数字;由题知,最后得到的num_data的结果必为所要求得的值。

public class MoreThanHalfNum {

/*****************实现方法一**********************/
//解法一:基于Partition方法
public int MoreThanHalfNum1(int[] data){
if((data == null) || data.length == 0){
return 0;
}
//先进行一次Partition
int target = data.length >> 1;//目标index
int start = 0;
int end = data.length - 1;//设定默认初始值
int index = Parttition(data, start, end);

while(index != target){
if(index < target)<span style="font-family: Arial, Helvetica, sans-serif;">{</span><span style="font-family: Arial, Helvetica, sans-serif;">//表示中位数在data[index]后半部分</span>
start = index  + 1;
}
else   <span style="font-family: Arial, Helvetica, sans-serif;">{</span><span style="font-family: Arial, Helvetica, sans-serif;">//表示中位数在data[index]前半部分 </span>
end = index - 1;
}
index = Parttition(data, start, end);
}
//推断找到的数在原数组是否确实有>n/2个
return Judge(data, data[index]);
}

//推断找到的数在原数组是否确实有>n/2个
private int Judge(int[] data, int target_num){
int times = 0;
for(int num : data){
if(num == target_num){
times++;
}
}
return times*2 > data.length ?

target_num : 0;
}

//高速排序的核心方法
private int Parttition(int[] data,int start,int end){
//选取哨兵
int mid_num = data[end];
int index = start;//位置记录

for(int i = start; i < end; i++){
if(data[i] > mid_num){
swap(data, i, index);
}
else {
index++ ;
}
}
swap(data, index, end);
return index;
}

//无法像C++一样使用引用实现。故仅仅好使用data数组进行改变
private void swap(int[] data , int a, int b){
int temp = data[a];
data[a] = data[b];
data[b] = temp;
}

/*****************实现方法二******************/
public int MoreThanHalfNum2(int[] data){
if((data == null) || data.length == 0){
return 0;
}
int num = data[0];//记录数据
int times = 1;//记录次数

for(int data_num : data){
if(0 == times){
num = data_num;
times ++;
}
else if(num == data_num){
times++;
}
else{
times--;
}
}
return Judge(data, num);
}

public static void main(String[] args) {
int[] data = {1,2,3,2,2,2,5,4,2};
MoreThanHalfNum moreThanHalfNum = new MoreThanHalfNum();
System.out.println(moreThanHalfNum.MoreThanHalfNum2(data));
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: