解題說明
Find Pivot Index
題目描述:給定整數陣列 nums,找出「軸心索引」——使得其左側所有元素之和等於右側所有元素之和的索引。若有多個則回傳最左邊的,若不存在則回傳 -1。軸心本身不計入任何一側。
解題思路:先計算陣列總和 total。然後從左到右遍歷,維護一個滾動的左側和 leftSum。對於索引 i,右側和等於 total - leftSum - nums[i]。若 leftSum == total - leftSum - nums[i],即找到軸心。每次迭代後將 nums[i] 累加到 leftSum。此法只需一次額外的 O(1) 空間。
C++ 解法
複雜度分析
時間複雜度:O(n) — 兩次線性遍歷(計算總和一次,尋找軸心一次)。
空間複雜度:O(1) — 只使用 total 和 leftSum 兩個整數變數。
虛擬碼
1. Compute total = sum of all elements 2. Set leftSum = 0 3. For i from 0 to n-1: a. If leftSum == total - leftSum - nums[i]: return i b. leftSum += nums[i] 4. Return -1
其他解法
前綴和陣列:預先計算 prefix[i] = nums[0..i-1] 的和,則左側和為 prefix[i],右側和為 total - prefix[i] - nums[i]。邏輯相同但額外使用 O(n) 空間存前綴和陣列。
雙指標從兩端逼近:維護左右兩個指標和各自的累計和,向內移動較小的一側,但此題不保證元素非負,雙指標無法保證正確性。
延伸思考
- 若陣列中有重複的軸心索引,如何找出所有軸心索引的集合?
- 若要找「右軸心」(右側和等於左側和,但優先回傳最右邊),需要如何修改?
- 這題與 LC 560(Subarray Sum Equals K)有何概念上的關聯?