/**
* 數組中超過一半的數字
* <p>
* 遇到相等的數count加1,不相等就減1,如果存在一個數在數組中佔一半,則遍歷完當前值必定是這個數
*
* @param arr
* @return
*/
public int moreThanHaIfNum(int[] arr) {
if (null == arr || 0 == arr.length) return -1;
int count = 1;
int cur = arr[0];
for (int i = 1; i < arr.length; i++) {
if (cur == arr[i]) {
count++;
} else if (count >= 1) {
count--;
} else {
count = 1;
cur = arr[i];
}
}
//驗證這個數是否在數組中佔一半以上,如果數組中不存在佔一半以上的數,則答案是錯誤的
count = 0;
for (int i = 0; i < arr.length; i++) {
if (cur == arr[i]) count++;
}
return count > arr.length / 2 ? cur : -1;
}
/**
* 利用快排函數
*
* @param arr
* @return
*/
public int moreThanHaIfNum1(int[] arr) {
if (null == arr || 0 == arr.length) return -1;
int len = arr.length;
int mid = len >> 1;
int left = 0;
int right = len - 1;
int index = partition(arr, left, right);
while (index != mid) {
if (index > mid) {
right = index - 1;
index = partition(arr, left, right);
} else {
left = index + 1;
index = partition(arr, left, right);
}
}
int count = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[index] == arr[i]) count++;
}
return count > arr.length / 2 ? arr[index] : -1;
}
private int partition(int[] arr, int left, int right) {
int less = left - 1;
int more = right;
while (left < more) {
if (arr[left] > arr[right]) {
swap(arr, left, --more);
} else if (arr[left] < arr[right]) {
swap(arr, ++less, left++);
} else {
left++;
}
}
swap(arr, more, right);
return less + 1;
}
private void swap(int[] arr, int l, int r) {
int t = arr[l];
arr[l] = arr[r];
arr[r] = t;
}
劍指Offer學習-面試題39:數組中超過一半的數字
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.