Leetcode724-配列の中央インデックスを見つける

タイトルの説明:

整数型の配列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;
    }

 

元の記事を公開17件 ・いい 0 ビュー3229

おすすめ

転載: blog.csdn.net/qq_31874075/article/details/103433652