2019-01-16

LeetCode 164. Maximum Gap.jpg

LeetCode 164. Maximum Gap

Description

Given an unsorted array, find the maximum difference between the successive elements in its sorted form.

Return 0 if the array contains less than 2 elements.

Example 1:

Input: [3,6,9,1]
Output: 3
Explanation: The sorted form of the array is [1,3,6,9], either
(3,6) or (6,9) has the maximum difference 3.
Example 2:

Input: [10]
Output: 0
Explanation: The array contains less than 2 elements, therefore return 0.
Note:

You may assume all elements in the array are non-negative integers and fit in the 32-bit signed integer range.
Try to solve it in linear time/space.

描述

給定一個無序的數(shù)組躁锡,找出數(shù)組在排序之后抒抬,相鄰元素之間最大的差值。

如果數(shù)組元素個數(shù)小于 2冲簿,則返回 0粟判。

示例 1:

輸入: [3,6,9,1]
輸出: 3
解釋: 排序后的數(shù)組是 [1,3,6,9], 其中相鄰元素 (3,6) 和 (6,9) 之間都存在最大差值 3。
示例 2:

輸入: [10]
輸出: 0
解釋: 數(shù)組元素個數(shù)小于 2峦剔,因此返回 0浮入。
說明:

你可以假設數(shù)組中所有元素都是非負整數(shù),且數(shù)值在 32 位有符號整數(shù)范圍內羊异。
請嘗試在線性時間復雜度和空間復雜度的條件下解決此問題事秀。

思路

  • 此題目使用桶排序.
  • 我們首先獲取數(shù)組的最小值mixnum和最大值maxnum,得到數(shù)組的范圍.
  • n個數(shù)有n-1個間隔野舶,我們計算平均間隔gap:(maxnum-minnum)/n-1 向上取整.
  • 我們計算需要的桶的個數(shù)size = int((maxnum-minnum)/gap)+1個
  • 此題目的關鍵思想是:在一個桶內的數(shù)字之間的差值一定小于gap易迹,如果某兩個數(shù)之間的差大于平均差gap,一定會被放到兩個桶內平道。最大的差一定大于等于gap(對一組數(shù)求平均值睹欲,平均值小于等于最大值),于是如果出現(xiàn)了兩個數(shù)a,b窘疮,且a和b的差大于gap袋哼,那么a和b一定會被放到兩個連續(xù)的桶t1,t2內闸衫,且a是t1桶的嘴后一個值(最大值)涛贯,b是t2桶的第一個值(最小值)。于是我們只需要記錄每個桶內的最大值和最小值蔚出,讓后用當前桶內的最小值減去上一個桶內的最大值得到maxgap弟翘,取maxgap最大的一個返回即可.
  • 要注意的是,如果在計算平均距離gap時候如果得到了0骄酗,說明所有的數(shù)相等稀余,這時可以直接返回0.
# -*- coding: utf-8 -*-
# @Author:             何睿
# @Create Date:        2019-01-16 12:08:24
# @Last Modified by:   何睿
# @Last Modified time: 2019-01-16 14:05:34

import math
import sys


class Solution(object):
    def maximumGap(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        # 獲取數(shù)字的個數(shù)
        count = len(nums)
        # 如果小于兩個數(shù)字,則根據(jù)題意返回0
        if count < 2:
            return 0
        # 確定所有數(shù)的范圍趋翻,尋找最值和最小值
        maxnum, minnum = max(nums), min(nums)
        # 計算數(shù)與數(shù)之間的平均距離(例如有10個數(shù)字睛琳,則一共有9個區(qū)間,平均的區(qū)間差為(最大值-最小值/9)向上取整)
        gap = math.ceil((maxnum - minnum) / (count - 1))
        # 如果gap等于0踏烙,說明所有的數(shù)值相等师骗,直接返回0
        if gap == 0:
            return 0
        # 計算需要多少個桶,桶個數(shù)為數(shù)組的返回/平均區(qū)間的范圍+1
        size = int((maxnum - minnum) / gap) + 1
        # 存儲每個桶的最小值宙帝,最大值
        bucketmin, bucketmax = [sys.maxsize] * size, [-sys.maxsize] * size
        for i in range(count):
            # 計算當前值應該放到哪個桶內
            index = int((nums[i] - minnum) / gap)
            # 放最小值
            bucketmin[index] = min(bucketmin[index], nums[i])
            # 放最大值
            bucketmax[index] = max(bucketmax[index], nums[i])
        premax, maxgap = bucketmax[0], 0
        # 最大的差值為當前桶的最小值減去前一個桶的最大值
        for i in range(1, size):
            if bucketmin[i] != sys.maxsize:
                maxgap = max(maxgap, bucketmin[i] - premax)
                premax = bucketmax[i]
        return maxgap

源代碼文件在這里.
?本文首發(fā)于何睿的博客丧凤,歡迎轉載募闲,轉載需保留文章來源步脓,作者信息和本聲明.

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市浩螺,隨后出現(xiàn)的幾起案子靴患,更是在濱河造成了極大的恐慌,老刑警劉巖要出,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸳君,死亡現(xiàn)場離奇詭異,居然都是意外死亡患蹂,警方通過查閱死者的電腦和手機或颊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來传于,“玉大人囱挑,你說我怎么就攤上這事≌恿铮” “怎么了平挑?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我通熄,道長唆涝,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任唇辨,我火速辦了婚禮廊酣,結果婚禮上,老公的妹妹穿的比我還像新娘助泽。我一直安慰自己啰扛,他們只是感情好,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布嗡贺。 她就那樣靜靜地躺著隐解,像睡著了一般。 火紅的嫁衣襯著肌膚如雪诫睬。 梳的紋絲不亂的頭發(fā)上煞茫,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機與錄音摄凡,去河邊找鬼续徽。 笑死,一個胖子當著我的面吹牛亲澡,可吹牛的內容都是我干的钦扭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼床绪,長吁一口氣:“原來是場噩夢啊……” “哼客情!你這毒婦竟也來了?” 一聲冷哼從身側響起癞己,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤膀斋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后痹雅,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仰担,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年绩社,在試婚紗的時候發(fā)現(xiàn)自己被綠了摔蓝。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡愉耙,死狀恐怖贮尉,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情劲阎,我是刑警寧澤绘盟,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響龄毡,放射性物質發(fā)生泄漏吠卷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一沦零、第九天 我趴在偏房一處隱蔽的房頂上張望祭隔。 院中可真熱鬧,春花似錦路操、人聲如沸疾渴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽搞坝。三九已至,卻和暖如春魁袜,著一層夾襖步出監(jiān)牢的瞬間桩撮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工峰弹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留店量,地道東北人。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓鞠呈,卻偏偏與公主長得像融师,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蚁吝,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內容