算法:查找过半元素
2010-07-09 16:27
99 查看
在一个规模为N的数组A中,所谓过半元素就是出现次数大于N/2的元素,例如 3, 3, 4, 2, 4, 4, 2, 4, 4 有一个过半元素4。给出一个算法,如果过半元素存在,就找出来,否则给出报告,要求给出O(N)的算法。
import java.util.HashMap;
public class IntegerCount {
/**
* @param args
*/
public static void count(int[] array) {
int r = -1;
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < array.length; i++) {
Integer value = map.get(array[i]);
if (value == null) {
map.put(array[i], 1);
} else if (value.intValue() >= array.length / 2) {
r = i;
break;
} else {
map.put(array[i], value.intValue() + 1);
}
}
if (r < 0) {
System.out.println("数组中无过半元素");
} else {
System.out.println("过半元素: " + array[r]);
}
}
public static void find(int[] array) {
int sum = 0;
int x = array[0];
for (int i = 1; i < array.length; i++) {
if (array[i] == x) {
sum = sum + 1;
} else {
sum = sum - 1;
}
if (sum < 0) {
x = array[i];
sum = 0;
}
}
if (x == array[array.length - 1] && sum == 0) {
System.out.println("数组中无过半元素");
} else {
System.out.println("过半元素: " + x);
}
}
public static void main(String[] args) {
int[] array0 = { 3, 3, 4, 2, 4, 4, 2, 4, 4 };
int[] array1 = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int[] array2 = { 0, 0, 3, 0, 0, 0, 0, 0, 9 };
count(array0);
count(array1);
count(array2);
find(array0);
find(array1);
find(array2);
}
}
import java.util.HashMap;
public class IntegerCount {
/**
* @param args
*/
public static void count(int[] array) {
int r = -1;
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < array.length; i++) {
Integer value = map.get(array[i]);
if (value == null) {
map.put(array[i], 1);
} else if (value.intValue() >= array.length / 2) {
r = i;
break;
} else {
map.put(array[i], value.intValue() + 1);
}
}
if (r < 0) {
System.out.println("数组中无过半元素");
} else {
System.out.println("过半元素: " + array[r]);
}
}
public static void find(int[] array) {
int sum = 0;
int x = array[0];
for (int i = 1; i < array.length; i++) {
if (array[i] == x) {
sum = sum + 1;
} else {
sum = sum - 1;
}
if (sum < 0) {
x = array[i];
sum = 0;
}
}
if (x == array[array.length - 1] && sum == 0) {
System.out.println("数组中无过半元素");
} else {
System.out.println("过半元素: " + x);
}
}
public static void main(String[] args) {
int[] array0 = { 3, 3, 4, 2, 4, 4, 2, 4, 4 };
int[] array1 = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int[] array2 = { 0, 0, 3, 0, 0, 0, 0, 0, 9 };
count(array0);
count(array1);
count(array2);
find(array0);
find(array1);
find(array2);
}
}
相关文章推荐
- 算法实验一:二分查找算法改进: 当搜索元素x不存在时,返回小于x的最大元素位置i和大于x的最小元素位置j. 当搜索元素在数组中时,i和j相同,均为x在数组中的位置。
- 算法与数据结构面试题(5)-查找最小的k 个元素
- 查找最小的k 个元素之C#算法实现
- js数组插入指定位置元素,删除指定位置元素,查找指定位置元素算法
- 【算法总结-top K】堆--查找最小(大)的k个元素
- 算法题之-二维数组元素查找
- 快速选择算法 查找数组中第个最小元素(元素不重复)
- 设计一个最优算法来查找一n个元素数组中的最大值和最小值。已知一种需要比较2n次的方法,请给一个更优的算法。
- 经典算法之查找重复元素
- 算法学习之数组元素查找
- 二叉查找树查找指定排名元素的算法
- 字符串算法——查找有序数组旋转后的最小值(无重复元素)(Find Minimum in Rotated Sorted Array)
- 百度2014校园招聘算法题--在数组中查找指定的元素t
- 字符串算法——查找数组多数元素(Majority Element II)
- 数据结构之算法2.6-在顺序线性表L中查找第1个值与e满足compare()的元素的位序
- 第九章中位数和顺序统计学之“查找第i小的元素(递归版)平均运行时间为O(n)算法”
- 折半查找,也称二分查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。
- 编程菜鸟的日记-初学尝试编程-顺序表的类定义及其基本操作算法(创建表、元素插入、元素删除、顺序查找、测表空、求表长、输出等)
- 查找数组中数量过半元素
- 数组中查找第k小元素的复杂度为O(n)的算法