做题回顾
https://leetcode.com/explore/learn/card/array-and-string/201/introduction-to-array/1144/
其实这道题不难,直接按他提示来就好。
就是遍历一遍数组求出数组的SUM,然后再遍历一遍数组,找到第一个(i左边数组的SUM)=SUM-(i左边数组的SUM),返回这个i;找不到就返回-1.这里SUM不会溢出。
要注意有正负的情况
We can precompute prefix sums P[i] = nums[0] + nums[1] + … + nums[i-1]. Then for each index, the left sum is P[i], and the right sum is P[P.length - 1] - P[i] - nums[i].
我天真地只考虑了全是正数的情况,妄想只遍历一次得到 i ,就是简单地设置left = 0, right = size() - 1,从两头扫数组求和,计算两边值相等的时候就输出,结果(-1,-1,-1,0)这个用例就打趴了我的代码
原始错误代码如下
.
class Solution {
public:
int pivotIndex(vector<int>& nums) {
int size = nums.size();
if(size == 0 || size == 2){
return -1;
}
if(size == 1){
return 0;
}
int left = 0, right = size -1;
int sum_left = nums[left], sum_right = nums[right];
for(int i = 0; i < (nums.size() - 3); i++){
if(sum_left < sum_right){
left++;
sum_left += nums[left];
}
else{
right--;
sum_right += nums[right];
}
}
if(sum_left != sum_right){
return -1;
}
else{
return (left + 1);
}
}
};
推倒重来
class Solution {
public:
int pivotIndex(vector<int>& nums) {
int size = nums.size();
if(size == 0 || size == 2){
return -1;
}
if(size == 1){
return 0;
}
int sum_left = nums[0], sum = 0;
for(int i = 0; i < nums.size(); i++){
sum += nums[i];
}
if((sum - sum_left) == 0){
return 0;
}
for(int i = 1; i < (nums.size()); i++){
if(sum_left != (sum - sum_left - nums[i])){
sum_left += nums[i];
}
else{
return i;
}
}
return -1;
}
};
Accept~