劍指offer之找出陣列中出現次數超過一半的數字
阿新 • • 發佈:2018-12-01
找出陣列中出現次數超過一半的數字
歡迎關注作者簡書
csdn傳送門
題目
一個數組中有一個數字的次數超過了陣列的一半,求出這個字元。如:int a[] = {2,3,2,2,2,2,2,5,4,1,2,3},求出超過一半的數字是2
分析
解法一
陣列中有一個數字出現的次數超過了陣列長度的一半,如果把陣列排序,排序之後位於陣列中間的數字一定是出現次數超過陣列長度一半的數字。排序演算法可以使用sort(快排),它的時間複雜度為O(n*logn)。例如:{2,5,7,2,2,8,2,2}排序後為:{2,2,2,2,2,5,7,8} ,中位數2是出現次數超過一半的數字
解法二
基於Partition函式的O(n)演算法
Partition函式是實現快排的基礎。同樣是找中位數,受快速排序演算法的啟發,如果選中的數字的下標是n/2,那麼這個數字就是中位數;如果選中的數字的下標大於n/2,則中位數在它的左邊,可以接著在它左邊部分的陣列中查詢;如果選中的數字的下標小於n/2,則中位數在它的右邊,可以接著在它右邊部分的陣列中查詢。這個過程是一個遞迴的過程。
原始碼
本題採用解法一
/**
* @program:
* @description: 陣列中出現次數超過一半的數字
* @author: zhouzhixiang
* @create: 2018-11-24 21:16
*/
public class Test28 {
/**
* 找出陣列中出現次數超過一半的數字
* @param numbers
* @return
*/
public static Integer moreThanHalfNum(int[] numbers) {
// 進行快速排序
quickSort(numbers, 0, numbers.length-1);
// 排序後的中位數即為目標值
return numbers[numbers.length/2+1];
}
/**
* 快速排序
* @param numbers
* @param left
* @param right
*/
private static void quickSort(int[] numbers, int left, int right) {
if (left < right) {
int key = numbers[left];
int low = left;
int high = right;
while (low < high) {
while (low < high && numbers[low] < numbers[key])
low++;
numbers[high] = numbers[low];
while (low < high && numbers[high] > numbers[key])
high--;
numbers[low] = numbers[high];
}
numbers[low] = numbers[key];
quickSort(numbers, left, low - 1);
quickSort(numbers, low + 1, right);
}
}
}
歡迎加入Java猿社群