劍指Offer 39 陣列中超過一半的數字

2021-08-15 15:53:38 字數 997 閱讀 3544

題目描述

陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。

解法1:根據陣列的特點,進行計數,出現次數最多的數字,如果超過陣列長度的一半兒

就是最終的結果

class solution

//求出出現次數最的數字的出現次數

int count=0;

for(int i=0;iif(numbers[i]==result)

count++;

}//長度判定

if(count>(numbers.size()/2))

return result;

else

return

0; }

};

解法2:

class solution 

else

}if(!morethanhalf(numbers,length,numbers[mid]))

return

0; return numbers[mid];

}bool morethanhalf(vector

numbers,int length,int mid)

if(times>(length>>1))

return

true;

return

false;

}int partition(vector

&data,int length,int start,int end)

}++small;

swap(&data[small],&data[end]);

return small;

}//交換兩個元素

void swap(int *a,int *b)

};

劍指offer39 陣列中出現次數超過一半的數字

先對陣列排序,然後取中位數,那個中位數肯定是超過一半的數字。採用快速排序時間複雜度為o nlogn 取中位數o n 基於partition函式的時間複雜度為o n 的演算法。這種演算法受快速排序演算法的啟發。在隨機快速排序演算法中,現在陣列中隨機選擇乙個 數字,然後調整陣列中數字的順序,使得比選中的...

劍指offer(39)陣列中重複的數字

在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。設定乙個比較陣列 返回值即可 重複了就break public bo...

劍指offer 39 陣列中出現超過一半的數

這道題的題目為 陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。解題思路分為三步 1 對陣列進行排序,排序之後位於中間的那個數字就是出現的次數超過陣列長度的一半的數。2 使用partition演算法對陣列進行排序,使得排序後隨機選取的數字的左邊數都小於它,右邊都大於它。如果選中的數字下...