我並無什麼方法,只是對於一件事情很長時間很熱心地去考慮罷了。 —— 艾薩克·牛頓算法
給定一個大小爲 n 的數組,找到其中的衆數。衆數是指在數組中出現次數大於 ⌊ n/2 ⌋ 的元素。數組
說明:微信
示例1:大數據
輸入: [3,2,3] 輸出: 3
示例2:code
輸入: [2,2,1,1,1,2,2] 輸出: 2
解法一:排序
衆數(Mode)是統計學名詞,在統計分佈上具備明顯集中趨勢點的數值,表明數據的通常水平(衆數能夠不存在或多於一個)。 修正定義:是一組數據中出現次數最多的數值,叫衆數,有時衆數在一組數中有好幾個。用M表示。 理性理解:簡單的說,就是一組數據中佔比例最多的那個數。這是百度百科上的定義,可是題目這裏給定義爲出現次數大於n/2的元素。既然是大於n/2,若是給數組排序, 必然會出如今中間位置。leetcode
Code:數學
class Solution { public int majorityElement(int[] nums) { Arrays.sort(nums); return nums[nums.length/2]; } }
解法二:it
解法一中sort方法實際上作的快速排序,時間複雜度爲O(nlog(n)),若是要求算法的時間複雜度爲 O(n),空間複雜度爲 O(1),則考察摩爾投票算法。io
Boyer-Moore majority vote algorithm(摩爾投票算法)是一種在線性時間O(n)和空間複雜度的狀況下,在一個元素序列中查找包含最多的元素。其核心思想是遍歷過程當中不一樣元素之間兩兩抵消,因爲一個數組中,出現次數超過n/2最多隻有一個,那麼遍歷結束時,未被抵消掉的便是出現次數超過n/2的元素。算法定義兩個變量,一個變量num和一個計數器count,初始狀況下計數器爲0,算法依次掃描數組中的元素,當處理元素x的時候,若是計數器爲0,那麼將x賦值給num,而後將計數器count設置爲1,若是計數器不爲0,那麼將變量num和x比較,若是相等,那麼計數器加1,若是不等,那麼計數器減1。處理以後,最後變量num的值,就是這個數組中最多的元素。
Code:
class Solution { public int majorityElement(int[] nums) { int num = nums[0]; int count = 0; for (int i = 0; i < nums.length; i++) { if (count == 0) { num = nums[i]; count = 1; } else if (nums[i] == num) { count++; } else { count--; } } return num; } }
小故事:
記起看《世界是部金融史》的時候看到牛頓的真實身份,當時比較震驚,分享一下,下面這段話摘自此書。
18世紀20年代以後,因爲某人不懈努力,白銀終於變爲非主流,黃金成爲貨幣世界永恆的主題。
某人,叫作艾薩克·牛頓,並且,與你認知的牛頓是同一我的。
牛頓,是偉大的數學家、物理學家,是經典力學、微積分的奠定人。對物理和數學來講,牛頓是奠定人;對牛頓來講,物理和數學只是業餘愛好。牛頓的本職工做,只是英國王室造幣大臣。在這個職位上他一干就是三十多年,那是至關兢兢業業。
牛頓當政以前「造幣大臣」只是一個閒職,沒有任何實權。各家銀行本身發行銀行券,自行鑄造鑄幣,日子過的那是至關滋潤,關造幣大臣何事。
黃金爲幣,始於牛頓。
按期分享大數據與知識圖譜相關知識點: