根據題意,若存在中心索引 i,則有 nums[0]+nums[1]+⋯+nums[i−1]=nums[i+1]+nums[i+2]+⋯+nums[n−1],其中 n 為陣列長度。令 tot 為所有元素的總和,s 為當前索引 i 左側所有元素的和,則有 s+nums[i]+s=tot,即 2×s+nums[i]=tot。
由於 s=j=0∑i−1nums[j],因此可以使用 前綴和(Prefix Sum) 的概念來解決這個問題。在遍歷陣列的過程中,維護一個前綴和 s,對於每個索引 i,檢查 2×s+nums[i]==tot 是否成立。如果成立,則 i 就是中心索引;否則則累加 s 並繼續遍歷。最後,如果不存在這樣的索引,則返回 −1。
複雜度分析
時間複雜度: O(n),其中 n 為陣列的長度。
空間複雜度: O(1)。
1 2 3 4 5 6 7 8 9
classSolution: defpivotIndex(self, nums: List[int]) -> int: tot = sum(nums) s = 0# prefix sum for i, x inenumerate(nums): if2 * s + x == tot: return i s += x return -1
1 2 3 4 5 6 7 8 9 10 11 12 13
classSolution { public: intpivotIndex(vector<int>& nums){ int n = nums.size(); int tot = accumulate(nums.begin(), nums.end(), 0); int s = 0; // prefix sum for (int i = 0; i < n; ++i) { if ((s << 1) + nums[i] == tot) return i; s += nums[i]; } return-1; } };
寫在最後
Cover photo is remixed from @吃肥皂泡泡, thanks for their work!