陣列中出現超過一半的數(複雜度O(n))
題目描述
陣列中有一個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入一個長度為9的陣列{1,2,3,2,2,2,5,4,2}。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。解題思路
對於這個題,複雜度為 的當然很簡單了,將陣列排序,取中間那個數,然後判斷一下就行了。那麼顯然我們可以繼續優化,要求條件是數字出現次數超過陣列長度一半,換句話說就是,這個數字出現的次數比其它所有數字加起來出現的次數還多。那麼我們根據這個進行撕烤,我們首先將第一個數看作是我們要求的數字即 tmp = numbers[0], cnt = 1
cnt++
, 否則 cnt--
, 顯然當 cnt = 0
的時候,我們更新 為當前比較的數字,掃完一遍後,最後,我們判斷 是否符合條件,如果符合條件,返回 , 否則返回
程式碼如下
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {
int n = numbers.size ();
if(n == 0) return 0;
int tmp = numbers[0], cnt = 1;
for(int i=1; i<n; i++) {
if(cnt == 0) {
tmp = numbers[i];
cnt = 1;
continue;
}
if(numbers[i] == tmp) cnt++;
else cnt--;
}
cnt = 0;
for(int i=0; i<n; i++) {
if(numbers[i] == tmp) cnt++;
}
if(cnt > n/2) return tmp;
return 0;
}
};
相關推薦
陣列中出現超過一半的數(複雜度O(n))
題目描述 陣列中有一個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入一個長度為9的陣列{1,2,3,2,2,2,5,4,2}。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如
查詢陣列中重複的唯一元素+時間複雜度O(n)+空間複雜度O(1)
這是我BIGO前端面試時,面試官給我出的一道題,題目是長度為N的陣列,元素大小範圍在[1,N-1],只有一個重複的元素,用O(n)的時間複雜度和O(1)的空間複雜度找出來這個重複的元素, 大致思路 1、因為總共有N個數,每個數的範圍是1到N-1,只有一個重複的數,所以這些數肯定是連續的 2
找出大陣列array中第k大的元素(要求時間複雜度O(n))
具體的程式碼實現:import java.util.Stack; /** * @author wuwh * @date createTime:2016年3月6日 上午12:23:14 */ public class KthBiggest { public static
js中刪除陣列中的某一元素(無下標時)
1、使用filter陣列去重; var arr1 = [1,2,3,4,5,6];//待運算元組 var j = 2;//待刪除元素 var noRepeat = function(arr1,arr2){ return arr1.flter(function(e){ re
快速冪和矩陣快速冪(複雜度Olog(n))C++實現
快速冪 快速冪顧名思義,就是快速算某個數的多少次冪。其時間複雜度為 O(log₂N), 與樸素的O(N)相比效率有了極大的提高。 快速冪實現原理 快速冪的原理比較好懂,就是說假如我們求的是3^11,其實比較通用的辦法就是 for 1:11 a*=3; 時間複雜
劍指offer(二十,二十一,二十二)包含min函式的棧,字串的排列,陣列中出現超過一半的數字
20:包含min函式的棧 題目描述 定義棧的資料結構,請在該型別中實現一個能夠得到棧最小元素的min函式。 感覺題目很無聊。。。我大js做這題就是方便,也讓我深刻意識到相對其他語言js繼承的強大性和靈活性。。。 var stack = []; function push(node) { stack
劍指offer:陣列中出現超過次數超過一半的數字(python實現)
題目描述 陣列中有一個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入一個長度為9的陣列{1,2,3,2,2,2,5,4,2}。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。 思路1:用字典的鍵值對實現,鍵存放陣列中的數字,值
陣列中只出現一次的數字,時間複雜度O(n),空間複雜度O(1)的解法
題目:一個整型數組裡除了兩個陣列外,其他的數字都出現了兩次,要找出這兩個數字。 異或運算有一個性質:任何數異或它自己,結果都是0;這樣如果題目變成只有一個數字只出現一次,其他數字均出現兩次,這樣我們從頭到尾異或陣列中的每一個數字,那麼最終的結果就是隻出現一次的數字
統計一個數字在排序陣列中出現的次數。(牛客劍指offer)
題目描述: 統計一個數字在排序陣列中出現的次數 class Solution { public: int GetNumberOfK(vector<int> data ,int k) { } }; Solu
陣列去重(時間複雜度nlgn,時間複雜度o(1))
public static void quickSort(int[] numArr, int left, int right) { //如果left等於right,即陣列只有一個元素,直接返回 if (left >= right) { return;
【劍指offer】陣列中的逆序對(校正書上錯誤)【歸併排序】
題目描述 在陣列中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個陣列中的逆序對的總數P。並將P對1000000007取模的結果輸出。 即輸出P%1000000007 題目保證輸入的陣列中沒有的相同的數字 資料範圍:
資料結構——陣列(5)找出陣列中唯一重複的數(元素範圍1~1000)
這個題目本身就有一定侷限性。比如,對於陣列a[10001],其中,1000個數就是1~1000的每個數,可以任意排列,然後再多一個重複的數。題目就是怎麼求出這個特殊的重複的數。 這一類問題的解決思路主要有以下幾種: 方法一:先求和,再相減。即陣列元素值求和,
js查詢陣列中是否存在某個值(some函式indexOf函式)
一、some方法some() 方法會依次執行陣列的每個元素:如果有一個元素滿足條件,則表示式返回true , 剩餘的元素不會再執行檢測。如果沒有滿足條件的元素,則返回false。注意: some() 不會對空陣列進行檢測。注意: some() 不會改變原始陣列。 var
Morris遍歷詳解——二叉樹先序中序後序遍歷( 時間複雜度O(N),空間複雜度O(1) )
Morris二叉樹遍歷: 來到當前的節點:Cur 如果Cur無左孩子,Cur向右移動 (Cur = Cur.right) 如果Cur有左孩子,找到Cur左子樹上最右的節點,記為 mostright
找出二維陣列中的最長路徑(最長連結串列)
一個二維陣列 比如 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 找出其中的最長路徑,每次只能向值比自己小的方向走,且每次只能向上或者向右走。 如24為起點:2
判斷陣列中是否有重複數字(two ways +位運算)
//判斷陣列中是否有重複的數字,有則返回true,沒有則返回false //方法一:先用時間複雜度為O(nlogn)的排序將陣列重建,然後遍歷尋找 //方法二:新建一個數組型hash表,key存num[i],valu存num[i]出現的次數。時間複雜度為O(n),空間
php多維陣列的去重(針對任意的鍵值進行去重)--二維陣列的唯一--時間複雜度~O(n)
以二維陣列為例,來說明針對任意鍵值的去重,時間複雜度為~O(n),只用一個foreach迴圈: <?php $arr = array( '0'=>array(
尋找主元素演算法(時間複雜度O(N),C#)
主元素問題:大小為N的陣列A,其主要元素是一個出現次數超過N/2的元素。 最近在學習演算法,書上發現這樣一道題,並且提供了一種遞迴演算法的概要,但是感覺不是特別好(遞迴判斷(時間複雜度大於O(N)了),還要對N的奇偶做出判斷以及使用附加陣列B),網上看了一下有一個SEO排行最靠前的(不說名字了,
把兩個有序數組合併成一個有序陣列,演算法複雜度O(N)
/** * */ /** * @author jueying: * @version 建立時間:2018-10-22 下午01:32:44 * 類說明 */ /** * @author jueying * */ public class Test4 {
BFPRT演算法:時間複雜度O(n)求第k小的數字(分治演算法+快排)
去年寫了一篇《分治演算法 求第 k k k小元素