package 分治法;
public class case04_寻找发帖水王 {
public static void main(String[] args) {
int[] A={1,2,3,2,7,2,5,2,8,2};
int[] B={2,1,2,3,2,7,2,5,2,8};
resolve(A);
resolve1(B);
}
//小出发
public static void resolve(int[] arr) {
//候选数,先定第一个元素
int candidate = arr[0];
//出现的次数
int nTimes = 0;
//扫描数组
for (int i = 0; i < arr.length; i++) {
//两两(两个数不同)相消为0,应该把现在的元素作为候选元素
if (nTimes == 0) {//??
candidate = arr[i];
nTimes = 1;
continue;
}
//遇到和候选元素相同的数,次数加一
if (arr[i] == candidate) {
nTimes++;
} else {
nTimes--;
}
}
System.out.println(candidate);
}
//变化,出现次数恰好为个数的一半,求出这个数
/**
* 关于加强版水王的题可以进行一边扫描数组求出这个数
* 水王占总数的一半,说明总数必为偶数
* 不失一般性,假设隔一个数就是一个水王,最后一定消减为0
* 水王可能使最后一个数,如果不是那么去掉最后一个数,剩下的就是candidate
*/
public static void resolve1(int[] arr) {
//候选数,先定第一个元素
int candidate = arr[0];
//出现的次数
int nTimes = 0;
int countofLast=0;//统计最后这个元素出现的次数
//扫描数组
int N=arr.length;
for (int i = 0; i < N; i++) {
//两两(两个数不同)相消为0,应该把现在的元素作为候选元素
if(arr[i]==arr[N-1]){
countofLast++;//增加一步和最后一个元素比较
}
if (nTimes == 0) {//??
candidate = arr[i];
nTimes = 1;
continue;
}
//遇到和候选元素相同的数,次数加一
if (arr[i] == candidate) {
nTimes++;
} else {
nTimes--;
}
}
//最后一个元素出现的次数使n/2
if(countofLast==N/2){
System.out.println(arr[N-1]);
}else {
System.out.println(candidate);
}
}
}
03-26
1160
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交