1. 程式人生 > >陣列與矩陣---陣列排序之後相鄰數的最大差值

陣列與矩陣---陣列排序之後相鄰數的最大差值

【題目】

  給定一個整型陣列arr,返回排序後的相鄰兩數的最大差值
  例如:
  arr = [9, 3, 1, 10]。如果排序,結果為[1, 3, 9, 10],9和3的差為最大值,故返回6.
  arr = [5, 5, 5, 5]。返回0.
  要求時間複雜度O(N).

【基本思路】

  利用桶排序的思想(不是直接進行桶排序),可以做到時間複雜度O(N),空間複雜度O(N)。

  遍歷陣列arr,找到最大值max和最小值min。如果陣列的長度為N,那麼我們準備N+1個桶,把max單獨放在第N+1個桶裡。arr中[min, max)範圍上的數放在1~N號桶裡。對於1~N個桶,每個桶負責的區間大小為(max- min) / N。所以對於元素num,它應該被分配進的桶的編號是(num - min) / ((max - min) / N) = (num - min) * N / (max - min)

,注意:這裡的桶的編號是從0開始計數的。
  
  arr一共有N個數,其中min一定會放在1號桶,max一定會放在N+1號桶,所以如果把N個數放入N+1個桶,其中一定有桶是空的。那麼差值最大的情況一定不來自同一個桶內的數。所以,如果arr經過排序,最大差值只可能來自某個非空桶的最小值減去前一個非空桶的最大值。

下面是使用python3.5實現的程式碼。

def maxGap(arr):
    def bucket(value, length, maxNum, minNum):
        return int((value - minNum) * length / (maxNum - minNum))

    if
arr == None or len(arr) == 0: return 0 length = len(arr) minNum = sys.maxsize maxNum = -sys.maxsize for i in range(len(arr)): minNum = min(minNum, arr[i]) maxNum = max(maxNum, arr[i]) if minNum == maxNum: return 0 hasNum = [False for i in range(length+1
)] maxs = [0 for i in range(length+1)] mins = [0 for i in range(length+1)] for i in range(len(arr)): index = bucket(arr[i], length, maxNum, minNum) #算出桶號 maxs[index] = max(maxs[index], arr[i]) if hasNum[index] else arr[i] mins[index] = min(mins[index], arr[i]) if hasNum[index] else arr[i] hasNum[index] = True lastMax = maxs[0] res = 0 for i in range(1, length+1): #計算最大差值 if hasNum[i]: res = max(res, mins[i] - lastMax) lastMax = maxs[i] return res

相關推薦

第2章 排序 || 第20節 相鄰練習題

最小值 pub gap || 算法 基於 return != 練習題 題目 有一個整形數組A,請設計一個復雜度為O(n)的算法,算出排序後相鄰兩數的最大差值。 給定一個int數組A和A的大小n,請返回最大的差值。保證數組元素多於1個。 測試樣例: [1,2,5,4,6]

排序17:相鄰

題目:有一個整形陣列A,請設計一個複雜度為O(n)的演算法,算出排序後相鄰兩數的最大差值。給定一個int陣列A和A的大小n,請返回最大的差值。保證陣列元素多於1個。測試樣例:[1,2,5,4,6],5返回:2 思路:直接的思路,先排序,再遍歷陣列求出相鄰2個數的差,保留最大

相鄰

有一個整形陣列A,請設計一個複雜度為O(n)的演算法,算出排序後相鄰兩數的最大差值。 給定一個int陣列A和A的大小n,請返回最大的差值。保證陣列元素多於1個。 測試樣例: [1,2,5,4,6],

JAVA語言之相鄰

有一個整形陣列A,請設計一個複雜度為O(n)的演算法,算出排序後相鄰兩數的最大差值。 給定一個int陣列A和A的大小n,請返回最大的差值。保證陣列元素多於1個。 測試樣例: [1,2,5,4,

陣列矩陣---陣列排序之後相鄰

【題目】   給定一個整型陣列arr,返回排序後的相鄰兩數的最大差值   例如:   arr = [9, 3, 1, 10]。如果排序,結果為[1, 3, 9, 10],9和3的差為最大值,故返回6.   arr = [5, 5, 5, 5]。返回0.

有一個整形陣列A,請設計一個複雜度為O(n)的演算法,算出排序相鄰

有一個整型陣列,請設計一個複雜度為O(n)的演算法,算出排序後相鄰兩數的最大差值。 Given an unsorted array, find the maximum difference betwe

演算法初級02——荷蘭國旗問題、隨機快速排序、堆排序、桶排序相鄰問題、工程中的綜合排序演算法

主要討論:荷蘭國旗問題、隨機快速排序、堆排序、穩定性、比較器、桶排序、相鄰兩數的最大差值問題和簡單介紹工程中的綜合排序演算法   題目一 給定一個數組arr,和一個數num,請把小於等於num的數放在陣列的左邊,大於num的數放在陣列的右邊。 要求額外空間複雜度O(1),時間複雜度O(N)

隨筆-間距/陣列相鄰元素的

題目:給定一個無序的陣列,找出陣列在排序之後,相鄰元素之間最大的差值。 如果陣列元素個數小於 2,則返回 0。 示例 1: 輸入: [3,6,9,1] 輸出: 3 解釋: 排序後的陣列是 [1,3,6,9], 其中相鄰元素 (3,6) 和 (6,9) 之間都存在最大差值 3。

組中後面元素前面元素的

AI 如果 數組array 暴力搜索 動態 int i+1 ray str 求數組中兩個元素差的最大值(後面的元素減去前面的元素)O(N)時間復雜度O(1)空間復雜度題目:在數組中找到兩個元素,計算後面的元素減去前面的元素的差。求出所有差的最大值。(你可以認為你在炒股票,買

思考一道題:非相鄰

 給定一個整數的陣列,相鄰的數不能同時選,求從該陣列選取若干整數,使得他們的和最大,要求只能使用o(1)的空間複雜度。 (抽時間再看看 )  // 非相鄰數最大和.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include

(動態規劃DP)面試題:求陣列中兩個數的(只能下標的減去下標小的)符合無後效性

空間複雜度優化演算法 void sovle_maxSub_Dp_OptimalSpace(int *a, int n){ int S=0; int max_value=INT_MIN; int max_index=0; for(int i=n-2;i>=1;

【左神算法課】子小於某閾,求滿足條件的子組個數

isempty all turn main .com color 子數組 sys ems 題目描述:    解法思路:   本題其實是滑動窗口的變形。主體思路為:   1.從第一個元素開始依次向後遍歷,同時維護兩個窗口(由於要同時操作窗口的頭部和尾部,故采用雙端隊

在O(n)時間復雜度內求無序數組中任意兩個元素的,以及存在的組

== result scan span pub ger oid 最小值 lose 題目描述: 求無序數組中任意兩個元素的最大差值,以及存在最大差值的組別數. 輸入: 輸入包含兩行,第一行輸入一個整數n;第二行n個正整數,用空格隔開. 輸出: 輸出為一行,包含最大差值,以及存

從無序序列中求這個序列排序後鄰點間的O(n)算法

算法 之間 一個 差值 最小 size 復雜度 play 實現 標題可能比較繞口,簡單點說就是給你一個無序數列A={a1,a2,a3……an},如果你把這個序列排序後變成序列B,求序列B中相鄰兩個元素之間相差數值的最大值。 註意:序列A的元素的大小在[1,2^31-1]之間

相鄰

請設計一個複雜度為O(n)的演算法,計算一個未排序陣列中排序後相鄰元素的最大差值。給定一個整數陣列A和陣列的大小n,請返回最大差值。保證陣列元素個數大於等於2小於等於500。 測試樣例:[9,3,1,10],4 返回:6   方法一:陣列下標法   解析:

LeetCode-陣列矩陣總結

陣列與矩陣 把陣列中的 0 移到末尾 283. Move Zeroes (Easy) For example, given nums = [0, 1, 0, 3, 12], after calling your function, nums should be [1, 3,

陣列矩陣

import numpy as np #建立隨機陣列 a1=np.random.randn(10) print(a1) #建立二維陣列 b1=np.random.randint(10,size=20).reshape(4,5) print(b1) #陣列運算 a2=np.random.ran

一. Matlab—陣列矩陣

矩陣相當於二維陣列 陣列–計算機上的概念 矩陣—線性代數上的概念 陣列 1.空陣列 A = [] 方括號裡什麼也沒有 2.標量 A = [5] 方括號裡只有一個值 3.向量 行向量 A = [1 2 3 4 5] 水平方向的若干個值構成行向量 可用空格表示不同元素之間的分隔,也可用逗號

Python列表、Numpy陣列矩陣的區別

參考部落格:http://blog.sina.com.cn/s/blog_d8f6ec6b0102wtbh.html、http://blog.sina.com.cn/s/blog_c4520abd010

matlab中的陣列矩陣

首先介紹陣列 在matlab中,有向量,陣列,矩陣的概念,本人感覺向量和陣列差不多,多行向量就是多維陣列,一維向量就是一維陣列。 建立一維陣列(向量)兩種方式:行向量a=[1 2 3]或者a=[1,2,3]