綜合應用: 計算軸心點位置 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

82會員
417Content count
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
題目會給我們一個山形的輸入陣列,和目標值target,要求我們找出目標值所在的陣列索引。如果出現兩次,返回比較小的那一個,也就是比較靠左的那個索引值。 山形的意思就是說,從最左側到山頂最大值都是遞增,從山頂最大值到右側都是遞減。
題目給定一個已排序的輸入陣列,陣列裡面的數字自分別代表每篇論文的被引用數。 要求我們計算h-index。 h-index的定義: 找一個最大的h值,使得有h篇論文,個別論文的被引用數都 大於等於 h
題目會給定一個2D 二維的矩陣,矩陣內的元素值代表對應的高度,要求我們找出相對最高點,也就是(大樓)高度大於N4 東、南、西、北 四個鄰居的索引值。 題目保證矩陣內相鄰的元素值都不相同,也又是相鄰的兩兩相比較,一定有一個比較高,有一個比較矮。
題目會給定一個陣列,陣列裡面的元素分布就像一座山峰。 最大值的左邊都是上坡段,最大值的右邊都是下坡段。 要求我們找出陣列裡面的絕對極大值(absolute max value)所在的陣列索引
這題的題目在這裡 題目會給定一個輸入整數x, 要求我們返回x的正整數平方根(取無條件捨去小數部分的正整數值)
題目會給我們一個排序好的矩陣matrix ,和一個目標值 target 要求我們在矩陣中尋找target,如果存在,返回True。 如果target 不存在,返回False 題目要求必須在O( log (m*n) )對數時間內完成 。
題目會給我們一個山形的輸入陣列,和目標值target,要求我們找出目標值所在的陣列索引。如果出現兩次,返回比較小的那一個,也就是比較靠左的那個索引值。 山形的意思就是說,從最左側到山頂最大值都是遞增,從山頂最大值到右側都是遞減。
題目給定一個已排序的輸入陣列,陣列裡面的數字自分別代表每篇論文的被引用數。 要求我們計算h-index。 h-index的定義: 找一個最大的h值,使得有h篇論文,個別論文的被引用數都 大於等於 h
題目會給定一個2D 二維的矩陣,矩陣內的元素值代表對應的高度,要求我們找出相對最高點,也就是(大樓)高度大於N4 東、南、西、北 四個鄰居的索引值。 題目保證矩陣內相鄰的元素值都不相同,也又是相鄰的兩兩相比較,一定有一個比較高,有一個比較矮。
題目會給定一個陣列,陣列裡面的元素分布就像一座山峰。 最大值的左邊都是上坡段,最大值的右邊都是下坡段。 要求我們找出陣列裡面的絕對極大值(absolute max value)所在的陣列索引
這題的題目在這裡 題目會給定一個輸入整數x, 要求我們返回x的正整數平方根(取無條件捨去小數部分的正整數值)
題目會給我們一個排序好的矩陣matrix ,和一個目標值 target 要求我們在矩陣中尋找target,如果存在,返回True。 如果target 不存在,返回False 題目要求必須在O( log (m*n) )對數時間內完成 。
你可能也想看
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
 這次的觸康健綜合課程一階是一場專業知識的饗宴,學員們除了掌握了肌應檢測的精準技巧,同時也學會了經絡調和的綜合應用。透過蘇老師的引導,他們為自己的健康與平衡迎來了一次豐富而深刻的學習體驗。
Thumbnail
🌟 Touch for Health®觸康健®肌應學綜合課程一階 🌟加開場 今年第三場觸康健一階(加開場)開課囉! 以下是今天的學員心得: 彭小姐:再次認識自己的潛意識,用檢測的方式很棒。 陳先生:我是我身體的主人。 林先生:我需要放鬆,太緊繃了。 李先生:認識自己,然後讓自
Thumbnail
如何透過生理測試/情緒測試/生化測試找出準確的指標肌肉,並且在調和前做事前檢查-迴路檢測/任脈檢測/充水度檢測 ,而在肌肉調和的方法則有脊椎反射、神經淋巴按揉點、神經血脈觸點、掃經、肌肉起止點技巧、利用食物強化肌肉。
Thumbnail
尚書房英文教竹北 本來考試的目的是為了評量學生的學習成果;與課綱結合,則又可以引導教學。如果題目每次忽難忽易,考的内容又不是出版社或學校所能掌握,那只會增加大家的負擔和困惑。高中課本、參考書讀了兩年半,到了考學測卻發現詞彙題單字或某用法沒教沒看過,這到底是誰的問題? 詞彙題如下表,綜合起來:今年五級
Thumbnail
➤主題:【每天來一股】英特爾有意買下格羅方德|英國19號大解封|SCFI綜合指數再度收高|啟碁 6286 、 6182 合晶、矽格 6257 英特爾有意買下第四大晶圓代工廠,是否真有意要跟台積電對戰,不過競爭的方面應該是鎖定在車用市場,因為就先進技術而言,仍然是沒人能比台積電的,近日也有傳出說台積
Thumbnail
​ 這個年代隨著E化的閱讀轉型型態,經營書店越來越不容易。在台灣各地的有許多獨立書店打造多元化的空間運用,以便於創造多元化的收益經營,小編截至目前去過此類書店,像是:TSUTAYA BOOKSTORE、誠品信義書店就是屬於以書店為主的經營,串連其他多元化的空間運用。這次要介紹的PLAY    GR
Thumbnail
經歷了年後班五天內值四班的還債後,來把拖稿的遊記心得整理一下。 自從畢業開始工作後,很久沒有全家人一起出遊了,趁著這次過年安排了家族旅行,也順便讓爸媽體驗一下經歷了入坑一年千錘百煉的點數旅行實戰應用。
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
 這次的觸康健綜合課程一階是一場專業知識的饗宴,學員們除了掌握了肌應檢測的精準技巧,同時也學會了經絡調和的綜合應用。透過蘇老師的引導,他們為自己的健康與平衡迎來了一次豐富而深刻的學習體驗。
Thumbnail
🌟 Touch for Health®觸康健®肌應學綜合課程一階 🌟加開場 今年第三場觸康健一階(加開場)開課囉! 以下是今天的學員心得: 彭小姐:再次認識自己的潛意識,用檢測的方式很棒。 陳先生:我是我身體的主人。 林先生:我需要放鬆,太緊繃了。 李先生:認識自己,然後讓自
Thumbnail
如何透過生理測試/情緒測試/生化測試找出準確的指標肌肉,並且在調和前做事前檢查-迴路檢測/任脈檢測/充水度檢測 ,而在肌肉調和的方法則有脊椎反射、神經淋巴按揉點、神經血脈觸點、掃經、肌肉起止點技巧、利用食物強化肌肉。
Thumbnail
尚書房英文教竹北 本來考試的目的是為了評量學生的學習成果;與課綱結合,則又可以引導教學。如果題目每次忽難忽易,考的内容又不是出版社或學校所能掌握,那只會增加大家的負擔和困惑。高中課本、參考書讀了兩年半,到了考學測卻發現詞彙題單字或某用法沒教沒看過,這到底是誰的問題? 詞彙題如下表,綜合起來:今年五級
Thumbnail
➤主題:【每天來一股】英特爾有意買下格羅方德|英國19號大解封|SCFI綜合指數再度收高|啟碁 6286 、 6182 合晶、矽格 6257 英特爾有意買下第四大晶圓代工廠,是否真有意要跟台積電對戰,不過競爭的方面應該是鎖定在車用市場,因為就先進技術而言,仍然是沒人能比台積電的,近日也有傳出說台積
Thumbnail
​ 這個年代隨著E化的閱讀轉型型態,經營書店越來越不容易。在台灣各地的有許多獨立書店打造多元化的空間運用,以便於創造多元化的收益經營,小編截至目前去過此類書店,像是:TSUTAYA BOOKSTORE、誠品信義書店就是屬於以書店為主的經營,串連其他多元化的空間運用。這次要介紹的PLAY    GR
Thumbnail
經歷了年後班五天內值四班的還債後,來把拖稿的遊記心得整理一下。 自從畢業開始工作後,很久沒有全家人一起出遊了,趁著這次過年安排了家族旅行,也順便讓爸媽體驗一下經歷了入坑一年千錘百煉的點數旅行實戰應用。