中山网站建设文化市场,做宣传图片的网站,北京免费网站建站模板,网站透明flash题目链接 剑指 Offer II 012. 左右两边子数组的和相等 easy 题目描述
给你一个整数数组 nums#xff0c;请计算数组的 中心下标 。
数组 中心下标 是数组的一个下标#xff0c;其左侧所有元素相加的和等于右侧所有元素相加的和。
如果中心下标位于数组最左端#xff0c;那…题目链接 剑指 Offer II 012. 左右两边子数组的和相等 easy 题目描述
给你一个整数数组 nums请计算数组的 中心下标 。
数组 中心下标 是数组的一个下标其左侧所有元素相加的和等于右侧所有元素相加的和。
如果中心下标位于数组最左端那么左侧数之和视为 0因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。
如果数组有多个中心下标应该返回 最靠近左边 的那一个。如果数组不存在中心下标返回 -1。
示例 1 输入nums [1,7,3,6,5,6] 输出3 解释 中心下标是 3 。 左侧数之和 sum nums[0] nums[1] nums[2] 1 7 3 11 右侧数之和 sum nums[4] nums[5] 5 6 11 二者相等。 示例 2 输入nums [1, 2, 3] 输出-1 解释 数组中不存在满足此条件的中心下标。 示例 3 输入nums [2, 1, -1] 输出0 解释 中心下标是 0 。 左侧数之和 sum 0 下标 0 左侧不存在元素 右侧数之和 sum nums[1] nums[2] 1 -1 0 。 提示
1nums.length1041 nums.length 10^41nums.length104−1000nums[i]1000-1000 nums[i] 1000−1000nums[i]1000
分析
对于原数组 nums[0 , n-1]区间我们用前缀和数组 s[0 , n]来表示其前缀和即
s[0]0s[0] 0s[0]0s[1]nums[0]s[1] nums[0]s[1]nums[0]s[2]nums[0]nums[1]s[2] nums[0] nums[1]s[2]nums[0]nums[1]s[3]nums[0]nums[1]nums[2]s[3] nums[0] nums[1] nums[2]s[3]nums[0]nums[1]nums[2]…
那么对于 下标i我们就能快速的得出它两边的和 leftsum s[i-1]rightsum s[n] - s[i]。我们只需要判断这两部分是否相等即可。
时间复杂度 O(n)O(n)O(n)
C代码
class Solution {
public:int pivotIndex(vectorint nums) {int n nums.size();vectorint s(n1);for(int i 1;i n;i) s[i] s[i-1] nums[i-1];for(int i 1;i n;i){if(s[i-1] s[n] - s[i]) return i - 1;}return -1;}
};Java代码
class Solution {public int pivotIndex(int[] nums) {int n nums.length;int[] s new int[n1];for(int i 1;i n;i) s[i] s[i-1] nums[i-1];for(int i 1;i n;i){if(s[i-1] s[n] - s[i]) return i - 1;}return -1;}
}