綜合應用: 計算軸心點位置 Find the Pivot Integer_Leetcode #2485

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

題目敘述

題目會給定一個n值,代表區間[1, n],請問軸心點位置在哪裡?

如果軸心點不存在,返回-1。


軸心點x的定義:

區間1~x的累加總和 = 區間x~n的累加總和。

用虛擬碼描述可以寫成

sum([1, 2, ..., x]) = sum([x, x+1, ..., n])

題目的原文敘述


測試範例

Example 1:

Input: n = 8
Output: 6
Explanation: 6 is the pivot integer since: 1 + 2 + 3 + 4 + 5 + 6 = 6 + 7 + 8 = 21.

Example 2:

Input: n = 1
Output: 1
Explanation: 1 is the pivot integer since: 1 = 1.

Example 3:

Input: n = 4
Output: -1
Explanation: It can be proved that no such integer exist.

約束條件

Constraints:

  • 1 <= n <= 1000

n值介於1~1000。


演算法 直覺法(也算是暴力展開法)

線性掃描區間內的每個整數i,再用for loop把[1, i]的區間和和[i, n]的區間和算出來。

比較兩者的區間和是否相等。

但是時間複雜度為O(n^2),有被平台拒絕的風險
同時暴力展開法也不是一個理想的面試、上機考最終答案。


演算法 直覺法的改良(用數列和公式去計算區間和)

線性掃描區間內的每個整數i,再用數列和公式把[1, i]的區間和和[i, n]的區間和算出來。

比較兩者的區間和是否相等。

時間複雜度為O(n),算是有進步了,但是還可以更好。


演算法 二分搜尋(用二分搜尋取代線性掃描)

並不需要真正的去try每一個整數i。


當我們知道下區間[1, i]和上區間[i, n]的區間和之後,

只要做個簡單判斷,去決定是否已經找到軸心點,如果還沒找到,也可以知道下一步的搜尋方向。

如果下區間[1, i]的和比較小,代表i還太小,下次二分搜尋[i, n]區間內的數字即可。

如果上區間[i, n]的和比較小,代表i還太大,下次二分搜尋[1, i]區間內的數字即可。

如果下區間[1, i]的和 = 上區間[i, n]的和,那麼i就是軸心點


時間複雜度為O(log n),算是很優秀了,也是一個理想的上機考、面試的最終答案。

空間複雜度為O(1),所用到的都是固定尺寸的臨時變數,為常數級別。


程式碼 二分搜尋(用二分搜尋取代線性掃描)

class Solution:


def rangeSum(self, bottom, top):

# Compute range sum from bottom to top inclusively
return (bottom + top) * ( top - bottom + 1 ) // 2


def pivotInteger(self, n: int) -> int:

lower = 1
upper = n

# Use binary search to find pivot
while( lower <= upper ):

# mid point
mid = (lower + upper) // 2

# range sum from 1 to mid inclusively
lowerSum = self.rangeSum(1, mid)

# range sum from mid to n inclusively
upperSum = self.rangeSum(mid, n)

if lowerSum == upperSum:
return mid

elif lowerSum < upperSum:
lower = mid+1

else:
upper = mid-1

return -1

演算法 解析解(推導軸心點的公式解)


從定義出發

軸心點x的定義:

區間1~x的累加總和 = 區間x~n的累加總和。

用虛擬碼描述可以寫成

sum([1, 2, ..., x]) = sum([x, x+1, ..., n])

下區間[1, x]的和 = 上區間[x, n]的和

可以改寫成

下區間[1, x]的和 = 整體[1, n]的和 - 區間[1, x-1]的和 (這一步算是關鍵步驟)


用數列和公式來表達,可以寫成

[x * (1 + x)] // 2 = [ n*(1+n) ] // 2 - [(x-1) * (x)] // 2

移向後,可以寫成

[x * (1 + x)] // 2 + [(x-1) * (x)] // 2 = [ n*(1+n) ] // 2

等號左邊打開整理後,可得到

x^2 = [ n*(1+n) ] // 2

請留意,到這邊,當初定義的軸心點x已經被我們推出公式解了
x = 開平方根{ [ n*(1+n) ] // 2 } = sqrt{ [ n*(1+n) ] // 2 }

接著,用x^2去驗算是不是恰好的於[ n*(1+n) ] // 2,如果是,x就是軸心點。


為什麼要驗算?
因為開根號之後有可能是得到帶小數點的值,但是,根據定義,軸心點x必須是整數


時間複雜度為O(1),算是本題最佳解了,但是上機考/面試時臨場要想到不是這麼容易

空間複雜度為O(1),所用到的都是固定尺寸的臨時變數,為常數級別。


程式碼 解析解(推導軸心點的公式解)

class Solution:

def pivotInteger(self, n: int) -> int:

summation = ( n * (n+1) ) // 2
pivot = int( sqrt(summation) )

if pivot ** 2 == summation:
return pivot

else:
return -1

Reference:

[1] Find the Pivot Integer - LeetCode

留言
avatar-img
留言分享你的想法!
avatar-img
小松鼠的演算法樂園
95會員
427內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
2024/08/14
題目敘述 Find K-th Smallest Pair Distance 給定一個輸入陣列nums和 參數k。 請找出第k小的pair distance是多少? pair distance定義為 abs( nums[i] - nums[j]), i 不等於j 也就是任意兩陣列元素差值的絕對值
Thumbnail
2024/08/14
題目敘述 Find K-th Smallest Pair Distance 給定一個輸入陣列nums和 參數k。 請找出第k小的pair distance是多少? pair distance定義為 abs( nums[i] - nums[j]), i 不等於j 也就是任意兩陣列元素差值的絕對值
Thumbnail
2024/05/27
給定一個輸入非負整樹陣列nums,請找出k值,使得陣列中恰好有k個元素大於等於 k。如果無解,回傳-1。尋找k值的方法包括排序法和二分搜尋法,時間複雜度都為O(n log n),空間複雜度為O(1)。關鍵知識點是當解空間具有遞增或遞減的性質時,可以用二分搜尋法加快搜尋效率。
Thumbnail
2024/05/27
給定一個輸入非負整樹陣列nums,請找出k值,使得陣列中恰好有k個元素大於等於 k。如果無解,回傳-1。尋找k值的方法包括排序法和二分搜尋法,時間複雜度都為O(n log n),空間複雜度為O(1)。關鍵知識點是當解空間具有遞增或遞減的性質時,可以用二分搜尋法加快搜尋效率。
Thumbnail
2024/03/19
這篇文章,會帶著大家複習以前學過的二分搜尋法(Binary Search)框架, 並且以二分搜尋法的概念為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個實用的演算法框架。 Binary search 二分搜尋法框架 用途: 在已經排序好的數列中尋找目標值。
Thumbnail
2024/03/19
這篇文章,會帶著大家複習以前學過的二分搜尋法(Binary Search)框架, 並且以二分搜尋法的概念為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個實用的演算法框架。 Binary search 二分搜尋法框架 用途: 在已經排序好的數列中尋找目標值。
Thumbnail
看更多
你可能也想看
Thumbnail
TOMICA第一波推出吉伊卡哇聯名小車車的時候馬上就被搶購一空,一直很扼腕當時沒有趕緊入手。前陣子閒來無事逛蝦皮,突然發現幾家商場都又開始重新上架,價格也都回到正常水準,估計是官方又再補了一批貨,想都沒想就立刻下單! 同文也跟大家分享近期蝦皮購物紀錄、好用推薦、蝦皮分潤計畫的聯盟行銷!
Thumbnail
TOMICA第一波推出吉伊卡哇聯名小車車的時候馬上就被搶購一空,一直很扼腕當時沒有趕緊入手。前陣子閒來無事逛蝦皮,突然發現幾家商場都又開始重新上架,價格也都回到正常水準,估計是官方又再補了一批貨,想都沒想就立刻下單! 同文也跟大家分享近期蝦皮購物紀錄、好用推薦、蝦皮分潤計畫的聯盟行銷!
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
給定一個輸入非負整樹陣列nums,請找出k值,使得陣列中恰好有k個元素大於等於 k。如果無解,回傳-1。尋找k值的方法包括排序法和二分搜尋法,時間複雜度都為O(n log n),空間複雜度為O(1)。關鍵知識點是當解空間具有遞增或遞減的性質時,可以用二分搜尋法加快搜尋效率。
Thumbnail
給定一個輸入非負整樹陣列nums,請找出k值,使得陣列中恰好有k個元素大於等於 k。如果無解,回傳-1。尋找k值的方法包括排序法和二分搜尋法,時間複雜度都為O(n log n),空間複雜度為O(1)。關鍵知識點是當解空間具有遞增或遞減的性質時,可以用二分搜尋法加快搜尋效率。
Thumbnail
題目給定一個布林代數的二元樹,要求我們計算最後的結果。 葉子節點都是真假值 非葉子節點都是布林運算子
Thumbnail
題目給定一個布林代數的二元樹,要求我們計算最後的結果。 葉子節點都是真假值 非葉子節點都是布林運算子
Thumbnail
題目敘述 輸入給定一個二元的二維矩陣grid 每次可以翻轉一條row,讓每個元素的01反相。 也可以翻轉一條column,讓每個元素的01反相。 可以操作任意多次。 最後把每條row視為一條二進位表達式的數字,並且進行加總,得到最後的分數。 請問分數的最大值是多少? 原本的英文題目敘
Thumbnail
題目敘述 輸入給定一個二元的二維矩陣grid 每次可以翻轉一條row,讓每個元素的01反相。 也可以翻轉一條column,讓每個元素的01反相。 可以操作任意多次。 最後把每條row視為一條二進位表達式的數字,並且進行加總,得到最後的分數。 請問分數的最大值是多少? 原本的英文題目敘
Thumbnail
這篇文章,會帶著大家複習以前學過的二分搜尋法(Binary Search)框架, 並且以二分搜尋法的概念為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個實用的演算法框架。 Binary search 二分搜尋法框架 用途: 在已經排序好的數列中尋找目標值。
Thumbnail
這篇文章,會帶著大家複習以前學過的二分搜尋法(Binary Search)框架, 並且以二分搜尋法的概念為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個實用的演算法框架。 Binary search 二分搜尋法框架 用途: 在已經排序好的數列中尋找目標值。
Thumbnail
找出區間[1, n] 內的軸心點位置。通過介紹直覺法、改良直覺法和二分搜尋等算法,最終給出了解析解(推導軸心點的公式解),提供了對應的程式碼和參考資料。該問題的最優解是使用解析解,能夠在O(1)的時間複雜度內找到答案。
Thumbnail
找出區間[1, n] 內的軸心點位置。通過介紹直覺法、改良直覺法和二分搜尋等算法,最終給出了解析解(推導軸心點的公式解),提供了對應的程式碼和參考資料。該問題的最優解是使用解析解,能夠在O(1)的時間複雜度內找到答案。
Thumbnail
題目會給定一個陣列nums和一個目標值goal。計算子陣列總和=goal的數目有多少。演算法包含前綴和和字典的技巧,時間複雜度為O(n),空間複雜度為O(n)。
Thumbnail
題目會給定一個陣列nums和一個目標值goal。計算子陣列總和=goal的數目有多少。演算法包含前綴和和字典的技巧,時間複雜度為O(n),空間複雜度為O(n)。
Thumbnail
題目敘述 題目會給我們一個整數陣列nums,要求我們計算平衡軸心點在哪? 平衡軸心的意思就是軸心點索引左側的元素總合 = 軸心點索引右側的元素總合 例如 整數陣列nums=[1,2,2,7,2,3] 7左側的元素總合為 1 + 2 + 2 = 5 7右側的元素總合為 2 + 3 = 5
Thumbnail
題目敘述 題目會給我們一個整數陣列nums,要求我們計算平衡軸心點在哪? 平衡軸心的意思就是軸心點索引左側的元素總合 = 軸心點索引右側的元素總合 例如 整數陣列nums=[1,2,2,7,2,3] 7左側的元素總合為 1 + 2 + 2 = 5 7右側的元素總合為 2 + 3 = 5
Thumbnail
題目敘述 題目給定我們一個輸入陣列nums 要求我們以正、負交叉排列的方式重組陣列,並且必須保持原本的相對順序。 並且以陣列的形式輸出返回答案。 例[5, 1, -2, -3] 重排後為 [5, -2, 1, -3] 題目的原文敘述 測試範例 Example 1: Input:
Thumbnail
題目敘述 題目給定我們一個輸入陣列nums 要求我們以正、負交叉排列的方式重組陣列,並且必須保持原本的相對順序。 並且以陣列的形式輸出返回答案。 例[5, 1, -2, -3] 重排後為 [5, -2, 1, -3] 題目的原文敘述 測試範例 Example 1: Input:
Thumbnail
題目敘述 題目會給我們一顆二元樹的根結點,請我們列出每一層最右邊的節點值,以陣列的形式返回答案。 題目的原文敘述 測試範例 Example 1: Input: root = [1,2,3,null,5,null,4] Output: [1,3,4] 每一層最右邊的節點值分別是1, 3,
Thumbnail
題目敘述 題目會給我們一顆二元樹的根結點,請我們列出每一層最右邊的節點值,以陣列的形式返回答案。 題目的原文敘述 測試範例 Example 1: Input: root = [1,2,3,null,5,null,4] Output: [1,3,4] 每一層最右邊的節點值分別是1, 3,
Thumbnail
究竟誰是 i、誰又是 j?矩陣問題務必趁腦子清楚時才解 XDD
Thumbnail
究竟誰是 i、誰又是 j?矩陣問題務必趁腦子清楚時才解 XDD
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News