标签:
《剑指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)//表示中位数在data[index]后半部分 { start = index + 1; } else //表示中位数在data[index]前半部分 { 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)); } }
标签:
原文地址:http://blog.csdn.net/woliuyunyicai/article/details/44337233