LeetCode(LeetCode)質問名:1480. 1次元配列の動的合計;タイプ:シンプル;実装:C ++

道は邪魔で長く、線が来ています。頭を下げて一生懸命頑張ってください。話さなければ、あなたは大ヒット作になります!さあ、サンニアン!

1トピック紹介

  元のタイトルリンク:1480。1次元配列の動的合計

  トピックについては上記のリンクを参照してください。簡単な説明は次のとおりです。

numの配列を与えます。配列の「動的合計」の計算式は、runningSum [i] = sum(nums [0]…nums [i])です。
数値の動的合計を返します。

  質問例1は次のとおりです。

输入:nums = [1,2,3,4]
输出:[1,3,6,10]
解释:动态和计算过程为 [1, 1+2, 1+2+3, 1+2+3+4]

  質問例2は次のとおりです。

输入:nums = [1,1,1,1,1]
输出:[1,2,3,4,5]
解释:动态和计算过程为 [1, 1+1, 1+1+1, 1+1+1+1, 1+1+1+1+1]

  サンプルトピック3は次のとおりです。

输入:nums = [3,1,2,10,1]
输出:[3,4,6,16,17]

  これはC ++で実装されており、タイトルによって与えられる基本的なフレームワークは次のとおりです。

class Solution {
    
    
public:
    vector<int> runningSum(vector<int>& nums) {
    
    
		
    }
};

2トピック分析

  まず、タイトルを数回注意深く読んだ後、以下の例を見ると、n番目のデータは(n-1)+ n番目のデータに等しいことがわかりました。わかりやすくするために表を作ります

下付き数字 0 1 2
生データ 1 2 4
計算プロセス 1 1 + 2 1 + 2 + 3 1 + 2 + 3 + 4
計算結果 1 6 10

  上記の表から、nの計算結果は、(n-1)にnの値を加えたものに等しいことがわかります(3 = 1 + 2; 6 = 3 + 3; 10 = 6 + 4;など)。

3問題を解決し始める

3.1最初の試み

  最初にコード化し、次に分析する

class Solution {
    
    
public:
    vector<int> runningSum(vector<int>& nums) {
    
    
        
        int temp;
        vector<int> vArray;

        vArray.push_back(nums.at(0));
        temp = nums.at(0);

        for(size_t i = 1; i < nums.size(); i++){
    
    
            temp += nums.at(i);
            vArray.push_back(temp);
        }

        return vArray;
    }
};

  最初に、トランジットとして使用されるint型の変数tempを定義し、次に戻り値として使用されるint型のコンテナーvArrayを定義しました。

  次の手順では、まず配列の最初の要素をvArrayにプッシュし、次にforループを使用してn-1ビットとnビットの合計を求め、それをtempに入れてから、tempをvArrayにプッシュします。

  forループが終了したら、vArrayコンテナーに直接戻ります。

  テスト後、この方法は非常に不器用ですが、機能も実現します。時間とメモリ
ここに画像の説明を挿入
  消費量は次のとおりです:メモリは少し大きいですが、効率は悪くありません...

3.2 2回目の試行

  この試みは、全員の解決策を読んだ後で彼らの考えを理解し、それから練習を再度実行することです。コードは次のとおりです

class Solution {
    
    
public:
    vector<int> runningSum(vector<int>& nums) {
    
    
        for(size_t i = 1; i < nums.size(); i++){
    
    
            nums[i] += nums[i - 1];
        }
        return nums;
    }
};

  この変更では、新しいローカル変数の代わりに既存のすべての変数が使用されるため、スペースを節約でき、forループ内の変数のタイプには、まだsize_tを使用しています。

  今回はコードが簡潔で理解しやすいように見えます。たとえば、このコアコードでは、次の2行は同等ですが、以前の分析のアイデアを説明しています。n番目はn番目とn番目の和に等しくなります-1人;

nums[i] += nums[i - 1];

nums[i] = nums[i] + nums[i - 1];

  結果は明らかです。今回使用したメモリ容量は少ないですが、次の図に示すように時間が長く、別の問題があります。これは直接8ミリ秒です。
ここに画像の説明を挿入

  考えて考えた結果、参照ソリューションとの違いは1つだけです。つまり、変数の型が異なります。size_t型を定義し、元のコードではint型を使用しているため、3回目の試行を行います。今回は、参照コードとまったく同じです。一貫しています。

3.3 3番目の試み

  この試行のコードは2回目とは異なり、変数のタイプのみです。具体的なコードは次のとおりです。

class Solution {
    
    
public:
    vector<int> runningSum(vector<int>& nums) {
    
    
        for(int i = 1; i < nums.size(); i++){
    
    
            nums[i] += nums[i - 1];
        }
        return nums;
    }
};

  あまり説明しませんが、以下
ここに画像の説明を挿入
  に示すように、結果を直接実行するだけです。この結果は中間値であり、メモリはそれほど大きくなく、実行時間も高速です。

  理由は配列であると推測されます。戻り値の型はすべてint型です。size_t型を使用してデータをフェッチすると、操作に時間がかかります。

3.4分析

  なぜ変数にそのような大きな違いがあるのですか?次のように、いくつかの結果を確認しましたが、それほど詳細ではありませんでした。

  2つ目はもう少し明確です。つまり、intは4バイトに固定されていますが、size_tはマシンのオペレーティングシステムなどに応じて決定されます。これが時間のかかる感覚の理由であり、さらに深い理由をさらに調査する必要があります。

4まとめ

  1. 私はずっと前からLeetCode(LeetCode)を勧めてきた先輩がいましたが、そのときに試してみたところ、何もできないことがわかりました。
  2. またここに来て、自分自身を向上させるための一定の基本的な知識を持っています。それがわからない場合は、情報を確認します。
  3. これはとても楽しいと思います。自分で数独も購入しました。何もする必要がなく、脳を鍛え、自分自身を生き続けるために自分の考えを持っています。
  4. さて、これで終わります。またお会いしましょう〜、良い週末を。

記事の内容が間違っている場合は、コメント/プライベートメッセージをたくさんアドバイスしてください、ありがとう!記事の内容に問題がないと思われる場合は、3つのリンク(ブックマーク、メッセージを残すなど)をクリックすることを忘れないでください。サポートが私の最大の励みです。ありがとうございます!

おすすめ

転載: blog.csdn.net/Fighting_Boom/article/details/106861881