問題來自牛客劍指offer
陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列**現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。
問題和尋找發帖水王屬於同一問題。即尋找眾數。
問題可以看成是對陣列中的數進行計數。
利用hashmap來作為輔助空間,陣列的值作為key,個數作為value。
思路:一次拿出兩個值,如果他們相等,那麼就保留,如果不相等,那麼就兩個一起丟棄,因為我們找到數是超過陣列長度一半的數,所以即使出現把眾數丟棄的情況,最後也可能保證留下來的是眾數。
實現:——1)利用投票的思想,flag存放結果的下標,從0位置開始,count記錄flag指向的數出現的個數
——2)遍歷陣列,如果這個數和flag指向的數相等,那麼我們就count++(保留這個數),如果不相等就count–(丟棄這兩個數)
——3)如果count等於0了,說明從開始位置到當前位置來看,該flag指向的位置並不是我們要的結果(超過長度一半),那麼就更新flag的值。
——4)最後flag指向的數就是最後留下的數(如果存在的話)。
尋找的眾數是不一定存在的,所以在最後需要驗證我們的結果是否滿足要求,因為如果不存在的話,flag指向的迴圈遍歷的最後的結果,但是並不是正確的結果。
// hashmap解法 時間複雜度o(n) 空間複雜度o(n)
public
intmorethanhalfnum_solution
(int
array)
else hm.
put(array[i],1
);}return0;
}// 投票解法 時間複雜度o(n) 空間複雜度o(1)
public
intmorethanhalfnum_solution
(int
array)
}else count++;}
int nums =0;
for(
int i =
0; i < array.length; i++)if
(array[i]
== array[flag]
) nums++
;return
(nums > array.length/2)
? array[flag]:0
;}
菜鳥刷題之路 Q1
寫乙個函式,求兩個整數之和,要求在函式體內不得使用 四則運算符號。一開始考慮轉化成位來計算,但是這樣 結構非常複雜且當出現負數時就難以計算。之後轉化思維,從十進位制數字計算的本身上來看 兩個數 ab cd 的計算過程可以看成是 a c e,b d f,如果e,f大於10,就保留ef 的個位數。如果出...
菜鳥刷題之路 Q16
乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。問題用hashmap解決是很容易想到的。使用異或運算的特點也可以解決該問題。將陣列的值作為key存入hashmap 1 當該值存在於hashmap中,刪除它 2 當該值不存在加入它 最後整個hashmap中剩...
菜鳥刷題之路 Q17
輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。思路採用的中序遍歷,實現的是採用非遞迴。將左指標指向前節點,右節點指向後節點。public treenode convert treenode prootoftree prootoftr...