LeetCode 724配列の中心インデックスHERODINGのLeetCodeの道を探す


整数タイプの配列numsを指定するには、配列の「中心インデックス」を返す方法を作成します.
配列中心インデックスを定義します.配列中心インデックスの左側のすべての要素が加算され、右側のすべての要素が加算された和に等しいです.
配列に中心インデックスが存在しない場合は、-1を返します.配列に複数の中心インデックスがある場合は、左側に最も近いインデックスを返す必要があります.
例1:
入力:nums=[1,7,3,6,5,6]出力:3解釈:インデックス3(nums[3]=6)の左側数の和(1+7+3=11)は、右側数の和(5+6=11)と等しい.また、3は、要件を満たす最初の中心インデックスでもあります.
例2:
入力:nums=[1,2,3]出力:-1解釈:配列にこの条件を満たす中心インデックスが存在しない.
説明:
nums        [0, 10000]。
     nums[i]          [-1000, 1000]   。

ソース:力ボタン(LeetCode)リンク:https://leetcode-cn.com/problems/find-pivot-index著作権はインターネットの所有に帰属する.商業転載は公式の授権に連絡してください.非商業転載は出典を明記してください.
解題構想:まず総数と、最左要素とを定義し、次に総数の和を計算し、最後に再び配列を遍歴し、左から右へ、左右の両側が等しいかどうかを判断し、等しくない左側が累加し続け、判断の根拠は(sumLeft*2+nums[i]==sum)であり、コードは以下の通りである.
class Solution {
     
public:
    int pivotIndex(vector<int>& nums) {
     
        //      、     
        int sum = 0;
        int sumLeft = 0;
        //      
        for(int i = 0; i < nums.size(); i ++) {
     
            sum += nums[i];
        }
        //           
        for(int i = 0; i < nums.size(); i ++) {
     
            if(sumLeft * 2 + nums[i] == sum) {
     
                return i;
            }
            sumLeft += nums[i];
        }
        return -1;
    }
};


/*  :heroding
  :https://leetcode-cn.com/problems/find-pivot-index/solution/czui-rong-yi-li-jie-de-si-lu-by-heroding-twx5/
  :  (LeetCode)
        。             ,          。*/

公式問題解で使われているaccumulate関数を使ってvector配列の総和を計算してみると、効率がさらに向上しました!コードは次のとおりです.
class Solution {
     
public:
    int pivotIndex(vector<int> &nums) {
     
        int total = accumulate(nums.begin(), nums.end(), 0);
        int sum = 0;
        for (int i = 0; i < nums.size(); ++i) {
     
            if (2 * sum + nums[i] == total) {
     
                return i;
            }
            sum += nums[i];
        }
        return -1;
    }
};