タイトルの説明:
整数型の配列numsを指定して、配列の「中央インデックス」を返すメソッドを記述します。
配列の中心インデックスを次のように定義します。配列の中心インデックスの左側のすべての要素の合計は、右側のすべての要素の合計と等しくなります。
配列に中央インデックスがない場合は、-1を返す必要があります。配列に複数の中央インデックスがある場合、左に最も近いインデックスを返す必要があります。
例1:
入力:数値= [1、7、3、6、5、6]
出力:3
説明:
インデックス3の左の数字の合計(num [3] = 6)(1 + 7 + 3 = 11)は、右の数字の合計(5 + 6 = 11)と等しくなります。同時に、3は要件を満たす最初の中央インデックスでもあります。
例2:
入力:数値= [1、2、3]
出力:-1
説明:
配列内にこの条件を満たす中央インデックスはありません。
説明:
numsの長さの範囲は[0、10000]です。
数値[i]は、[-1000、1000]の範囲の整数になります。
一見すると、タイトルはかなりシンプルに見えます。ダブルポインターを使用するだけでは不十分なので、2つのポインターを使用して前後から合計し、比較的小さく進めます。そのため、次のコードを使用します。
int pivotIndex(vector<int>& nums) {
if(!nums.size())
{
return -1;
}
int i = 0;
int j = nums.size() - 1;
int firstSum = nums[i];
int lastSum = nums[j];
while (i < j)
{
if (firstSum < lastSum)
{
firstSum += nums[++i];
}
else
{
lastSum += nums[--j];
}
}
if (lastSum == firstSum)
{
return i;
}
else
{
return -1;
}
}
しかし、テスト中に{-1、-1、-1、-1、-1,0}の栗が現れました。これはそれほど単純ではありません〜考え方を変えてください。検索なので、ハッシュテーブルを使用しますか?
int pivotIndex(vector<int>& nums) {
if(!nums.size())
{
return -1;
}
map<int, int> sum1;
map<int, int> sum2;
int firstSum = 0;
int lastSum = 0;
for (int i = 0; i < nums.size(); i++)
{
firstSum += nums[i];
sum1[i] = firstSum;
}
for (int i = nums.size() - 1; i >= 0; i--)
{
lastSum += nums[i];
sum2[i] = lastSum;
}
for (int i = 0; i < nums.size(); i++)
{
if (sum1[i] == sum2[i])
{
return i;
}
}
return -1;
};
合格、ただし「メモリ消費量:26.4 MB、すべてのcpp送信でユーザーの5.01%を倒した」、実際、このストレージは線形であり、ハッシュテーブルを使用する必要はなく、配列を使用するだけで、メモリ消費量は減少しますかなりたくさん。
最後に、ビッグガイによって書かれたコードを見てみましょう。これは非常に不思議なアイデアです。両側の合計は同じであるため、辺と* 2 +の間の数は配列全体の合計です。
int pivotIndex(vector<int>& nums)
{
int sum = 0;
int sumleft = 0;
int len = size(nums);
for(int i=0;i<len;i++)
sum += nums[i];
for(int i=0;i<len;i++)
{
if(sumleft*2+nums[i]==sum)
return i;
sumleft+=nums[i];
}
return -1;
}