LeetCode 724配列の中心インデックス、HERODINGのLeetCodeパスを見つける

整数型の配列番号が与えられた場合、配列の「センターインデックス」を返すメソッドを記述します。

配列の中心インデックスを次のように定義します。配列の中心インデックスの左側にあるすべての要素の合計は、右側にあるすべての要素の合計に等しくなります。

配列に中央インデックスがない場合は、-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
著作権はLeetCodeが所有しています商用の再版については、公式の承認に連絡してください。非商用の再版については、出典を示してください。

問題解決のアイデア:
最初に合計と左端の要素の合計を定義し、次に合計を計算し、最後に配列を左から右にもう一度トラバースして、左側と右側が等しいかどうかを判断します。不等式の左側は累積し続けます。判断は(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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。*/

公式ソリューションで使用されている累積関数を試して、ベクトル配列の合計を計算しました。効率がさらに向上しました。コードは次のように表示されます。

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;
    }
};

おすすめ

転載: blog.csdn.net/HERODING23/article/details/113285188