數據結構與算法《三》

我並無什麼方法,只是對於一件事情很長時間很熱心地去考慮罷了。 —— 艾薩克·牛頓算法

LeetCode: 求衆數

給定一個大小爲 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年代以後,因爲某人不懈努力,白銀終於變爲非主流,黃金成爲貨幣世界永恆的主題。

某人,叫作艾薩克·牛頓,並且,與你認知的牛頓是同一我的。

牛頓,是偉大的數學家、物理學家,是經典力學、微積分的奠定人。對物理和數學來講,牛頓是奠定人;對牛頓來講,物理和數學只是業餘愛好。牛頓的本職工做,只是英國王室造幣大臣。在這個職位上他一干就是三十多年,那是至關兢兢業業。

牛頓當政以前「造幣大臣」只是一個閒職,沒有任何實權。各家銀行本身發行銀行券,自行鑄造鑄幣,日子過的那是至關滋潤,關造幣大臣何事。

黃金爲幣,始於牛頓。

按期分享大數據與知識圖譜相關知識點:
微信公衆號

相關文章
相關標籤/搜索