活用軸心點觀念 Sum of Absolute Diff in Sorted Array_Leetcode #1685

閱讀時間約 4 分鐘

題目敘述

題目會給我們一個陣列nums,要求我們以每個陣列元素分別當作軸心點,計算差值的絕對值總和,最後以陣列的形式,返回答案。



測試範例

Example 1:

Input: nums = [2,3,5]
Output: [4,3,5]
Explanation: Assuming the arrays are 0-indexed, then
result[0] = |2-2| + |2-3| + |2-5| = 0 + 1 + 3 = 4,
result[1] = |3-2| + |3-3| + |3-5| = 1 + 0 + 2 = 3,
result[2] = |5-2| + |5-3| + |5-5| = 3 + 2 + 0 = 5.

Example 2:

Input: nums = [1,4,6,8,10]
Output: [24,15,13,15,21]

 


約束條件

Constraints:

  • 2 <= nums.length <= 105
  • 1 <= nums[i] <= nums[i + 1] <= 104

演算法

除了第一直覺的暴力雙層迴圈搜索之外,其實還有一個更高效率的線性掃描法。


在側邊欄中搜尋

在側邊欄中搜尋


對於當下軸心點nums[i]而言

題目所求

= abs( nums[i] - nums[0] ) + abs( nums[i] - nums[1] ) + ... + abs( nums[i] - nums[i-1] ) + abs( nums[i] - nums[i+1] ) + ... + abs( nums[i] - nums[n-1] )


= num[i] 對比較小的那一群數字差值絕對值總和 +

num[i] 對比較大的那一群數字差值絕對值總和


= abs { nums[i] * i - sum of smaller numbers } +

abs{ nums[i] * (n-1-i) - sum of larger numbers }


= nums[i] * i - sum of smaller numbers +

sum of larger numbers - nums[i] * (n-1-i)


我們可以用一個線性掃描,從左往右,每次迭代更新 比較小的那一群數字總和比較大的那一群數字總和計算整體的差值絕對值總和

最終,以陣列的形式返回答案即可。


程式碼

class Solution:
 def getSumAbsoluteDifferences(self, nums: List[int]) -> List[int]:
  
  n = len(nums)
  sum_below, sum_above = 0, sum(nums)

  sum_abs_diff = []

  # Iterate each number
  for i, number in enumerate(nums):
   
   # Sum of numbers smaller than nums[i]
   sum_below += number

   # Sum of absolute difference to smaller numbers
   diff_sum_below = i * number - sum_below

   # Sum of absolute difference to larger numbers
   diff_sum_above = sum_above - (n-1-i) * number

   sum_abs_diff.append( diff_sum_below + diff_sum_above )

   # Sum of numbers larger than nums[i]
   sum_above -= number

  return sum_abs_diff

複雜度分析

時間複雜度: O(n)

線性掃描,從左到右掃描每個陣列元素,總共耗時O(n)


空間複雜度: O(1)

解答所使用的空間sum_abs_diff不包含在內。
剩下的都是固定尺存的臨時變數,為常數級別O(1)


關鍵知識點

從圖解,和歸納小規模的例子可以發現:

我們可以用一個線性掃描,從左往右,每次迭代更新 比較小的那一群數字總和比較大的那一群數字總和計算整體的差值絕對值總和


Reference:

[1] Python O(n) by linear scan [w/ Visualization] - Sum of Absolute Differences in a Sorted Array - LeetCode

86會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
題目敘述 題目會給我們一個不規則排列的二維陣列,要求我們列出從起點出發,走次對角線,由左下到右上逐層拜訪的路徑。
題目敘述 題目會給我們一個陣列,要求我們返回 兩數之和=target所在的陣列索引值。 題目還額外保證,一定剛好有一組解。 測試範例 Example 1: Input: nums = [2,7,11,15], target = 9 Output: [0,1]
這題的題目在這裡:Find Pivot Index 題目敘述 題目會給我們一個整數陣列nums,要求我們計算平衡軸心點在哪? 平衡軸心的意思就是軸心點索引左側的元素總合 = 軸心點索引右側的元素總合
題目會給我們一個方陣,要求我們計算兩條對角線的元素總和。
題目會給我們一個整數陣列nums,裡面都是正整數,而且陣列長度保證是偶數。 要求我們倆倆將所有整數配對成一組pair,要求我們最小化pair sum的極大值。
這題的題目在這裡:Gray Code 題目敘述 題目會給我們一個bit寬度n,要求我們造出所有格雷編碼。 格雷編碼就是一組二進位編碼,每兩個相鄰的編碼的hamming distance都是1。 如果第一次接觸的讀者,可以參考 Wiki Gray Code
題目敘述 題目會給我們一個不規則排列的二維陣列,要求我們列出從起點出發,走次對角線,由左下到右上逐層拜訪的路徑。
題目敘述 題目會給我們一個陣列,要求我們返回 兩數之和=target所在的陣列索引值。 題目還額外保證,一定剛好有一組解。 測試範例 Example 1: Input: nums = [2,7,11,15], target = 9 Output: [0,1]
這題的題目在這裡:Find Pivot Index 題目敘述 題目會給我們一個整數陣列nums,要求我們計算平衡軸心點在哪? 平衡軸心的意思就是軸心點索引左側的元素總合 = 軸心點索引右側的元素總合
題目會給我們一個方陣,要求我們計算兩條對角線的元素總和。
題目會給我們一個整數陣列nums,裡面都是正整數,而且陣列長度保證是偶數。 要求我們倆倆將所有整數配對成一組pair,要求我們最小化pair sum的極大值。
這題的題目在這裡:Gray Code 題目敘述 題目會給我們一個bit寬度n,要求我們造出所有格雷編碼。 格雷編碼就是一組二進位編碼,每兩個相鄰的編碼的hamming distance都是1。 如果第一次接觸的讀者,可以參考 Wiki Gray Code
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
知識複利的精神在於能夠透過自己知識對自我與他人產生效益,創造出影響力,進而達到利他賦能的境界。所以界定自己的方向也很重要,成為「一個領域的專家」是知識複利的重要基底,許多人在經營專家型個人品牌時就是貪多嚼不爛,太過模糊的定位反而讓識別性降低,但到底要怎樣型塑自己的方向可能也是一大課題。 
Thumbnail
除了整合綠界支付、藍新支付 & TapPay 外,近期也針對全台灣市佔率超過 6 成的 LINE Pay 深度整合,提供台灣商家更完整的金流串接選項,當客戶在線上預約時,能直接完成付款,提昇預約出席率!同時,也將 LINE Pay 整合於 LINE 官方帳號機器人 中,當客戶在官方帳號預約時,系統也
在華人社會的傳統裡,借貸絕對是一種禁忌。 在古代,大概只有賭徒、生意出現問題的人才會借貸。正所謂家醜不出外傳,生意出現問題是難以啟齒的事,因此需要資金應付生意周轉的人如非必要都不會向外人借貸,他們只會向家人親戚借錢。賭徒欠債更是家醜中之家醜,他們只會在賭檔內或街角向小混混借高利貸。即使家窮水盡,
Thumbnail
前兩天公司同事說接下來有個影片需要用直播的形式放送,而 OBS 中最有效的方式竟然是建立一個「媒體來源」,選好檔案就開播??? 讓 VLC Video Source 來帶你離開播片地獄 😉
Thumbnail
近期 SimplyBook.me 與 LINE 官方帳號 2.0 深度整合,讓有使用 LINE 做為溝通管道的經營者,用更少的預約打造專屬預約機器人,引導客戶直接透過 LINE 完成線上預約,也幫助經營者減少人力客服成本,將人力使用在更有價值的地方! 而這次 SimplyBook.me 要分享的是搭
Thumbnail
這周我們充分的練習骨盆的各個方向與各個姿勢下的動作。那麼骨盆在人體的意義是什麼呢?人體動作的選擇性想告訴大家的又是什麼呢?
Thumbnail
Facebook 像素是一個分析工具,透過複製程式碼安裝在你的預約網頁中,就能幫你追蹤、衡量成效,也可以用更快的方式來建立廣告活動的受眾。舉例來說,當用戶進入到有安裝 Facebook 像素的頁面時,便會觸發程式碼並記錄其行為,作為後續廣告投放的資料庫。如果你也有串連 Google Analytic
T型人才或π型人的重要性早已不用再多解釋,就HR最近流行的敏捷管理跟社群招募都是從不同的專業套用活用過來的,敏捷的觀念在我於newegg服務期間就已經軟體業流行起來,目前這個觀念可以說是管理上的當紅炸子雞。我們是不是具備多種專長我認為還不是最重要的,更重要的是要懂得把不同專業的概念運用在目前的工作中
Thumbnail
提供顧客線上預約的管道,不僅可以增加你的營業額,還可以減少顧客缺席率,更增加了 顧客終身價值。根據 GetApp 研究指出,傳統的電話預約與訊息預約方式已經漸漸式微且被消費者淘汰,取而代之的是,有 70% 的顧客傾向線上預約!
Thumbnail
預知對方的感情   一般來說,高敏感人與人交際時內心會顧慮太多,害自己身心俱疲。因此,他們多半會選擇不需要與人交際的工作或興趣。不過,改用自我本位的方式生活之後,善解人意反而成了一大優勢
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
知識複利的精神在於能夠透過自己知識對自我與他人產生效益,創造出影響力,進而達到利他賦能的境界。所以界定自己的方向也很重要,成為「一個領域的專家」是知識複利的重要基底,許多人在經營專家型個人品牌時就是貪多嚼不爛,太過模糊的定位反而讓識別性降低,但到底要怎樣型塑自己的方向可能也是一大課題。 
Thumbnail
除了整合綠界支付、藍新支付 & TapPay 外,近期也針對全台灣市佔率超過 6 成的 LINE Pay 深度整合,提供台灣商家更完整的金流串接選項,當客戶在線上預約時,能直接完成付款,提昇預約出席率!同時,也將 LINE Pay 整合於 LINE 官方帳號機器人 中,當客戶在官方帳號預約時,系統也
在華人社會的傳統裡,借貸絕對是一種禁忌。 在古代,大概只有賭徒、生意出現問題的人才會借貸。正所謂家醜不出外傳,生意出現問題是難以啟齒的事,因此需要資金應付生意周轉的人如非必要都不會向外人借貸,他們只會向家人親戚借錢。賭徒欠債更是家醜中之家醜,他們只會在賭檔內或街角向小混混借高利貸。即使家窮水盡,
Thumbnail
前兩天公司同事說接下來有個影片需要用直播的形式放送,而 OBS 中最有效的方式竟然是建立一個「媒體來源」,選好檔案就開播??? 讓 VLC Video Source 來帶你離開播片地獄 😉
Thumbnail
近期 SimplyBook.me 與 LINE 官方帳號 2.0 深度整合,讓有使用 LINE 做為溝通管道的經營者,用更少的預約打造專屬預約機器人,引導客戶直接透過 LINE 完成線上預約,也幫助經營者減少人力客服成本,將人力使用在更有價值的地方! 而這次 SimplyBook.me 要分享的是搭
Thumbnail
這周我們充分的練習骨盆的各個方向與各個姿勢下的動作。那麼骨盆在人體的意義是什麼呢?人體動作的選擇性想告訴大家的又是什麼呢?
Thumbnail
Facebook 像素是一個分析工具,透過複製程式碼安裝在你的預約網頁中,就能幫你追蹤、衡量成效,也可以用更快的方式來建立廣告活動的受眾。舉例來說,當用戶進入到有安裝 Facebook 像素的頁面時,便會觸發程式碼並記錄其行為,作為後續廣告投放的資料庫。如果你也有串連 Google Analytic
T型人才或π型人的重要性早已不用再多解釋,就HR最近流行的敏捷管理跟社群招募都是從不同的專業套用活用過來的,敏捷的觀念在我於newegg服務期間就已經軟體業流行起來,目前這個觀念可以說是管理上的當紅炸子雞。我們是不是具備多種專長我認為還不是最重要的,更重要的是要懂得把不同專業的概念運用在目前的工作中
Thumbnail
提供顧客線上預約的管道,不僅可以增加你的營業額,還可以減少顧客缺席率,更增加了 顧客終身價值。根據 GetApp 研究指出,傳統的電話預約與訊息預約方式已經漸漸式微且被消費者淘汰,取而代之的是,有 70% 的顧客傾向線上預約!
Thumbnail
預知對方的感情   一般來說,高敏感人與人交際時內心會顧慮太多,害自己身心俱疲。因此,他們多半會選擇不需要與人交際的工作或興趣。不過,改用自我本位的方式生活之後,善解人意反而成了一大優勢