题解 | #相等的草堆#

相等的草堆

https://www.nowcoder.com/practice/0e2f3b27bbdc45fcbc70cc4fd41e15fe

方法一(适用于无负数数组):相向双指针。左边和小于右边和则左指针右移并加到左和,右边和小于左边和则右指针左移并加到右和,直到左右指针相遇。若相遇时左和仍然不等于右和,则失败,成功则返回指针。

#include <cstdio>
#include <vector>
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param nums int整型vector
     * @return int整型
     */
    int pivotIndex(vector<int>& nums) {
        // write code here
        int len = nums.size();
        int left = 0, right = len - 1;
        int suml = nums[left], sumr = nums[right];
        while (left < right) {
            if (suml < sumr) {
                left++;
                suml += nums[left];
            } else if (suml > sumr) {
                right--;
                sumr += nums[right];
            } else {
                left++;
                right--;
                suml += nums[left];
                sumr += nums[right];
            }
        }
        if(suml==sumr)
            return left;
        else
         return -1;;
    }
};

方法二:从右边开始加的前缀和。把全局的前缀和先算出来,快速定区间。

#include <cstdio>
#include <vector>
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param nums int整型vector
     * @return int整型
     */
    int pivotIndex(vector<int>& nums) {
        // write code here
        int len = nums.size();
        vector<int> sums(len + 1, 0);
        for (int i = len - 1; i >= 0; --i) {
            sums[i] = sums[i + 1] + nums[i];
        }

        // sum[i] : 前i个元素之和
        
        int val = 0;
        for (int i = 0; i < len; ++i) {
            if (val == sums[i + 1]) {
                return i;
            }
            val += nums[i];
        }
        return -1;
    }
};

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务