Greedy 策略: 最大化陣列距離 Max Distance in Arrays_Leetcode #624

Greedy 策略: 最大化陣列距離 Max Distance in Arrays_Leetcode #624

更新於 發佈於 閱讀時間約 4 分鐘

題目敘述 624. Maximum Distance in Arrays


給定一個輸入二維陣列arrays。

請計算的陣列距離是多少?


陣列距離的定義 = max | a - b | 其中 a, b 來自不同的一維陣列


測試範例

Example 1:

Input: arrays = [[1,2,3],[4,5],[1,2,3]]
Output: 4
Explanation:

Max distance = | 5 - 1 | = 4

Example 2:

Input: arrays = [[1],[1]]
Output: 0

Max distance = | 1 - 1 | = 0

約束條件

Constraints:

  • m == arrays.length

輸入陣列長度 = m

  • 2 <= m <= 10^5

m 介於 2 ~ 十萬之間。

  • 1 <= arrays[i].length <= 500

內部的一維陣列長度介於1~500

  • -10^4 <= arrays[i][j] <= 10^4

每個陣列元素值介於 負一萬 ~ 正一萬

  • arrays[i] is sorted in ascending order.

內部的一維陣列都是升序排列。

  • There will be at most 10^5 integers in all the arrays.

輸入裡面,最多會有十萬個整數。


演算法 Greedy 策略: 最大化差值


distance = | a - b | 其中 a, b 來自不同的一維陣列

那就紀錄已經看過的最大值和最小值。

接著每回合針對當下的最小值和最大值做計算,取最大的差值。


候選人1: 已經看過的最大值 - 當下的最小值。

候選人2: 當下的最大值 -已經看過的最小值 。


接著更新distance 的最大值,選擇比較的大的那個候選人去做更新。


程式碼 Greedy 策略: 最大化差值

class Solution:
def maxDistance(self, arrays):

best = 0

# Initialization
cur_max, cur_min = -math.inf, math.inf

for numbers in arrays:

# Update max distance
best = max(best, cur_max - numbers[0], numbers[-1] - cur_min )

# Update max value before, min value before
cur_max, cur_min = max(cur_max, numbers[-1]), min(cur_min, numbers[0])

return best


複雜度分析

時間複雜度: O(n)

依序處理每一個單獨的一維陣列,總共耗時O(n)。


空間複雜度: O(1)

所用到的變數都是臨時變數,所需空間為O(1)常數級別。


Refernce:

[1] Maximum Distance in Arrays - LeetCode

avatar-img
小松鼠的演算法樂園
95會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言
avatar-img
留言分享你的想法!
題目敘述 860. Lemonade Change 假想一個經營檸檬水小舖的情境。 一杯檸檬水都賣$5 顧客付錢時只有三種可能,$5, $10 或 $ 20 初始時,檸檬水小舖沒有零錢。 給定一個顧客買檸檬水的付錢陣列bills,請問能不能滿足每一筆交易,並且找開零錢。 如果可以
題目敘述 Find K-th Smallest Pair Distance 給定一個輸入陣列nums和 參數k。 請找出第k小的pair distance是多少? pair distance定義為 abs( nums[i] - nums[j]), i 不等於j 也就是任意兩陣列元素差值的絕對值
題目敘述 Combination Sum II_Leetcode #40 給定一個整數陣列candidates 和 目標值target。 每個陣列元素只能選擇一次,請問有多少種組合方法,可以使得組合數總和 = target? 請把滿足組合數總和 = target的組合方法以陣列的形式返回答案
題目敘述 149. Max Points on a Line 給定一串2維平面的點座標,請問最多有幾個點落在同一條直線上? 落在同一條直線也就是數學上所謂的"共線" colinear
題目敘述: 給定一個二維陣列的高與寬,並且給定起點位置座標。 請從起點位置開始順時針拜訪陣列元素,並且把沿路走過的座標記錄下來。 以陣列的形式返回答案。
題目敘述 Integer to English Words 給定一個整數num 請轉換成對應的的英文數字表達(One, Two, Three, ... 那種數字表達式)
題目敘述 860. Lemonade Change 假想一個經營檸檬水小舖的情境。 一杯檸檬水都賣$5 顧客付錢時只有三種可能,$5, $10 或 $ 20 初始時,檸檬水小舖沒有零錢。 給定一個顧客買檸檬水的付錢陣列bills,請問能不能滿足每一筆交易,並且找開零錢。 如果可以
題目敘述 Find K-th Smallest Pair Distance 給定一個輸入陣列nums和 參數k。 請找出第k小的pair distance是多少? pair distance定義為 abs( nums[i] - nums[j]), i 不等於j 也就是任意兩陣列元素差值的絕對值
題目敘述 Combination Sum II_Leetcode #40 給定一個整數陣列candidates 和 目標值target。 每個陣列元素只能選擇一次,請問有多少種組合方法,可以使得組合數總和 = target? 請把滿足組合數總和 = target的組合方法以陣列的形式返回答案
題目敘述 149. Max Points on a Line 給定一串2維平面的點座標,請問最多有幾個點落在同一條直線上? 落在同一條直線也就是數學上所謂的"共線" colinear
題目敘述: 給定一個二維陣列的高與寬,並且給定起點位置座標。 請從起點位置開始順時針拜訪陣列元素,並且把沿路走過的座標記錄下來。 以陣列的形式返回答案。
題目敘述 Integer to English Words 給定一個整數num 請轉換成對應的的英文數字表達(One, Two, Three, ... 那種數字表達式)