陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。
2.1 方法一:基於partition函式的時間複雜度為o(n)的演算法
class solution
}swap(numbers[i+1], numbers[r]);
return i+1;
}bool checkmorethanhalf(vectornumbers, int result)
else
}int result = numbers[middle];
if(!checkmorethanhalf(numbers, result))
result = 0;
return result;
}};
2.2 方法二:根據陣列特點找出時間複雜度為o(n)的演算法
陣列中有乙個數字出現的次數超過陣列長度的一半,也就是說它出現的次數比其他數字出現的次數的和還要多,因此,我們可以考慮遍歷陣列的時候儲存兩個值:乙個是陣列中的乙個數字;另乙個是次數。當我們遍歷到下乙個數字的時候,如果下乙個數字和我們之前儲存的數字不同,則次數減1.如果次數為0,那麼我們需要儲存下乙個數字,並把次數設為1。由於我們要找的數字出現的次數比其他所有數字出現的次數之和還要多,那麼要找的數字肯定是最後一次把次數設為1時對應的數字。
class solution
else if(numbers[i] == result)
++times;
else
--times;
}if(!checkmorethanhalf(numbers, result))
result = 0;
return result;
}};
面試題39 陣列中出現次數超過一半的數字
題目 陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列 現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。思路一 陣列排序後,如果符合條件的數存在,則一定是陣列中間那個數。比如 1,2,2,2,3 或2,2,2,3,4 或2,3,...
面試題29 陣列中出現次數超過一半的數字
題目 陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5詞,超過陣列長度的一半,因此輸出2.思路 1,如果對陣列排序,那麼n 2對應的數一定是超過一半的數字 前提是存在這個數字 即長度為n的陣列中第n 2大的數字,o n 2,根據陣列...
面試題25 陣列中出現次數超過一半的數字
方法一 先對陣列進行排序 再遍歷排序後的陣列,統計每個數 的次數 出現次數最大的數即為要找的數。時間複雜度 o nlogn o n o nlogn 不需要額外儲存空間 方法二 先對陣列進行排序 出現次數超過陣列長度的一半的數必然是 陣列中間的那個數 時間複雜度o nlgn o 1 o nlgn 不需...