給定一個整數類型的數組 nums,請編寫一個可以返回數組「中心索引」的方法。
咱們是這樣定義數組中心索引的:數組中心索引的左側全部元素相加的和等於右側全部元素相加的和。
若是數組不存在中心索引,那麼咱們應該返回 -1。若是數組有多箇中心索引,那麼咱們應該返回最靠近左邊的那一個。
難易程度:easy
示例 1:數組
輸入:
nums = [1, 7, 3, 6, 5, 6]
輸出: 3
解釋:
索引3 (nums[3] = 6) 的左側數之和(1 + 7 + 3 = 11),與右側數之和(5 + 6 = 11)相等。
同時, 3 也是第一個符合要求的中心索引。spa
示例 2:code
輸入:
nums = [1, 2, 3]
輸出: -1
解釋:
數組中不存在知足此條件的中心索引。
說明:索引
nums 的長度範圍爲 [0, 10000]。
任何一個 nums[i] 將會是一個範圍在 [-1000, 1000]的整數。it
開闢一個新的數組prev_sum,數組大小爲N+1(N爲原始數組大小),遍歷整個數組計算前i個元素之和存入prev_sum[i]中,注意prev_sum[0]=0。
則,原數組索引j,左側元素之和爲prev_sum[j], 右側元素之和爲prev_sum[N] - prev_sum[j + 1]。
循環比較prev_sum[j]是否與prev_sum[N] - prev_sum[j + 1]相等。
時間複雜度:O(N)
空間複雜度:O(N)io
class Solution { public: int pivotIndex(vector<int>& nums) { int size = nums.size(); if (size < 1) { return -1; } vector<int> prev_sum; prev_sum.push_back(0); for (int i = 0; i < size; i++) { prev_sum.push_back(nums[i] + prev_sum[i]); } int sum = prev_sum[size]; for (int i = 0; i < size; i++) { if (prev_sum[i] == sum - prev_sum[i+1]) { return i; } } return -1; } };
解法一中,須要開闢一個新的數組,如何避免這部分空間的浪費呢?經過分析,咱們能夠知道,整個數組全部元素之和sum爲索引i上的元素加上左右兩側子數組之和,按照中心索引的定義,中心索引i的左側全部元素相加的和left_sum等於右側全部元素相加的和right_sum,即left_sum * 2 = sum - nums[i]。
時間複雜度:O(N)
空間複雜度:O(1)class
class Solution { public: int pivotIndex(vector<int>& nums) { int sum = 0; int size = nums.size(); for (int i = 0; i < size; i++) { sum += nums[i]; } int left_sum = 0; for (int i = 0; i < size; i++) { if (left_sum * 2 == sum - nums[i]) { return i; } left_sum += nums[i]; } return -1; } };