剑指offer-数组中出现次数超过一半的数字
2016-10-29 13:09
337 查看
题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
解法一:O(n)
解法二:排序后,总多的数就是中位数(快排)
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
解法一:O(n)
package demo1; import org.junit.Test; public class Solution { public int MoreThanHalfNum_Solution(int[] array) { if (array == null || array.length <= 0) { return 0; } int result = array[0]; int times = 1; // 相同加一,不同减一 for (int i = 1; i < array.length; i++) { if (times == 0) { result = array[i]; times = 1; } else if (result == array[i]) { times++; } else { times--; } } // 进一步验证是否超过总数一半 if (!checkMoreThanHalf(array, result)) { result = 0; } System.out.println(result); return result; } private boolean checkMoreThanHalf(int[] array, int result) { int times = 0; for (int i = 0; i < array.length; i++) { if (array[i] == result) { times++; } } Boolean isMore = true; if (times * 2 <= array.length) { isMore = false; } return isMore; } @Test public void test() { int[] array = { 1, 2, 3, 2, 2, 2, 5, 4, 2 }; MoreThanHalfNum_Solution(array); } }
解法二:排序后,总多的数就是中位数(快排)
package demo1; import org.junit.Test; public class Solution { public int MoreThanHalfNum_Solution(int[] array) { if(array ==null || array.length <=0 ) { return 0; } int middle = array.length >> 1; quickSort(array, 0, array.length-1); int result = array[middle]; if (!checkMoreThanHalf(array, result)) { result = 0; } System.out.println(result); return result; } private void quickSort(int[] array, int low, int high) { // TODO Auto-generated method stub int i = low, j = high, index; if (low >= high) return; index = array[i]; while (i < j) { while (i < j && array[j] >= index) { j--; } if (i < j) { array[i] = array[j]; i++; } while (i < j && array[i] < index) { i++; } if (i < j) { array[j] = array[i]; j--; } } array[i] = index; quickSort(array, low, i - 1); quickSort(array, i + 1, high); } private boolean checkMoreThanHalf(int[] array, int result) { int times = 0; for (int i = 0; i < array.length; i++) { if (array[i] == result) { times++; } } Boolean isMore = true; if (times * 2 <= array.length) { isMore = false; } return isMore; } @Test public void test() { int[] array = { 1, 2, 3, 2, 2, 2, 5, 4, 2 }; MoreThanHalfNum_Solution(array); } }
相关文章推荐
- 码农小汪-剑指Offer之26 -数组中出现次数超过一半的数字
- [剑指offer][面试题29]数组中出现次数超过一半的数字
- 剑指offer29题,牛客网中“数组中出现次数超过一半的数字”
- 剑指Offer:面试题29 数组中出现次数超过一半的数字
- 算法题005 剑指Offer面试题29 数组中出现次数超过一半的数字
- 剑指offer 5.2 时间效率1 - 数组中出现次数超过一半的数字
- 【剑指Offer学习】【面试题29 :数组中出现次数超过一半的数字】
- 【剑指offer】十九,数组中出现次数超过一半的数字
- 【剑指offer】面试题29:数组中出现次数超过一半的数字
- 剑指offer—数组中出现次数超过一半的数字
- 剑指offer-29:数组中出现次数超过一半的数字
- 【剑指offer】Q29:数组中出现次数超过一半的数字
- 剑指offer:数组中出现次数超过一半的数字
- 剑指offer面试题29-数组中出现次数超过一半的数字
- 【剑指Offer面试编程题】题目1370:数组中出现次数超过一半的数字--九度OJ
- 剑指Offer29数组中出现次数超过一半的数字
- 剑指offer-29 数组中出现次数超过一半的数字
- 剑指offer 面试题29—数组中出现次数超过一半的数字
- 剑指offer-第五章优化时间和空间效率(数组中出现次数超过一半的数字)
- 剑指Offer之 - 数组中出现次数超过一半的数字