道は邪魔で長く、線が来ています。頭を下げて一生懸命頑張ってください。話さなければ、あなたは大ヒット作になります!さあ、サンニアン!
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 | 3 |
---|---|---|---|---|
生データ | 1 | 2 | 3 | 4 |
計算プロセス | 1 | 1 + 2 | 1 + 2 + 3 | 1 + 2 + 3 + 4 |
計算結果 | 1 | 3 | 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まとめ
- 私はずっと前からLeetCode(LeetCode)を勧めてきた先輩がいましたが、そのときに試してみたところ、何もできないことがわかりました。
- またここに来て、自分自身を向上させるための一定の基本的な知識を持っています。それがわからない場合は、情報を確認します。
- これはとても楽しいと思います。自分で数独も購入しました。何もする必要がなく、脳を鍛え、自分自身を生き続けるために自分の考えを持っています。
- さて、これで終わります。またお会いしましょう〜、良い週末を。
記事の内容が間違っている場合は、コメント/プライベートメッセージをたくさんアドバイスしてください、ありがとう!記事の内容に問題がないと思われる場合は、3つのリンク(ブックマーク、メッセージを残すなど)をクリックすることを忘れないでください。サポートが私の最大の励みです。ありがとうございます!