這道題的題目為:陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。
解題思路分為三步:
(1)對陣列進行排序,排序之後位於中間的那個數字就是出現的次數超過陣列長度的一半的數。
(2)使用partition演算法對陣列進行排序,使得排序後隨機選取的數字的左邊數都小於它,右邊都大於它。如果選中的數字下標正好是n/2,那麼這個數字就是陣列的中位數。
(3)如果它的下標小於n/2,那麼中位數字於它的右邊,則可以在它右邊的部分查詢。反之則去它的左邊部分查詢。
**如下:
#include#include#include//標記陣列是否有效
bool numberuse = false;
void swap(int *a, int *b)
//partition排序演算法
int partition(int array, int left, int right)
while (begin < end && array[right] <= array[end])
swap(array + begin, array + end);
} swap(array + begin, array + right);
return begin;
}//確保輸入的陣列有效
bool isuse(int *number, int length)
//確保result在陣列中有出現次數超過一半
bool checkmorethanhalf(int * number, int length, int result)
//確保result有效
bool ismorethanhalf = true;
if (times * 2 <= length)
return ismorethanhalf;
}int morethanhalf(int * number, int length)
else
}int result = number[middle];
if (!checkmorethanhalf(number, length, result))
result;
return result;
}
劍指offer39 陣列中出現次數超過一半的數字
先對陣列排序,然後取中位數,那個中位數肯定是超過一半的數字。採用快速排序時間複雜度為o nlogn 取中位數o n 基於partition函式的時間複雜度為o n 的演算法。這種演算法受快速排序演算法的啟發。在隨機快速排序演算法中,現在陣列中隨機選擇乙個 數字,然後調整陣列中數字的順序,使得比選中的...
劍指offer第39 陣列中出現次數超過一半的數字
陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。coding utf 8 classsolution defmorethanhalfnum solution self numb...
劍指offer(39)陣列中重複的數字
在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。設定乙個比較陣列 返回值即可 重複了就break public bo...