トピック:削除する要素
トピックリンク:(https://leetcode-cn.com/problems/remove-element/)
第一印象:
昨日の同じ要素の除去と同様に
(参照します。https://blog.csdn.net/DZZ18803835618/article /詳細/ 104607900)
まず、によってもたらさ2ポインタのアイデア:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int len = nums.size();
if(len == 0) return 0;
int i = 0;
for(int j = 0; j < len; j++)
{
if(nums[j] != val)
{
nums[i] = nums[j];
i++;
}
}
return i;
}
};
しかし、あまりにも遅い:
2回の試行:
少しを試し、公式の答えを読んで、本当に速度が倍に倍増(多くはないテストケースが理由の要素を削除する必要がおそらくあるため)
原則は、おそらくこれです:のみの場合要素を削除するには、要素は「に比べて、この要素の最後のビット、配列の長さマイナス1で覆われている第一印象のコピー要素の多くを削除することなく、時間を節約するために」が、取り除かれた要素を大量に必要となりますテストケースは、時間がほぼ同じでなければなりません。コードは以下の通りであります:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int n = nums.size();
int i = 0;
while(i < n)
{
if(nums[i] == val)
{
nums[i] = nums[n - 1];
n--;
}
else
{
i++;
}
}
return n;
}
};
ここでは、私は彼らの習慣の使用が理由かもしれないが、使用のためのループ構造を習慣的に使用使用されるたびに、より洗練された、だけでなく、特定のシーンの具体的な分析かもしれいくつかの単語を言いたいです。
3回:
この時点では、速度はかなりもっともらしい、知らず知らずのうちにこの直接排除する要素を発見した後、)最速のソリューションのユースケースを開き、消去STLコンテナを(使用できることが判明するポイント:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
for(int i = 0;i < nums.size(); i++)
{
if(nums[i] == val)
{
nums.erase(nums.begin() + i);
i--;
}
}
return nums.size();
}
};
結果の書き込みと自信を持って提出した後:
不屈の精神を戦って、そして再送信すると、私は唯一の人々の30%を破ったのはこの非科学的、ああ、同じコードを、その品質ごとに時間を見つけて飛躍はああ~~
彼らは彼らのコードは非常に洗練されていることを感じるが、時間が不十分で与えられた場合、あなたが複数回試すことができ、将来的に誰もが思える(あなたがそれを知っている場合でも、非常に暴力的な場合)
余談:
コードを書くのその前に、私の非常に好きではない、それは非常に好きではないが、しかし、最終的に彼の位置を認識しています。各記事の最後の文は、それに取り付けられた後、ジュニアコンピュータとしてコバンの意識は今、非常に遅く、気分に応じて、自分のモチベーション、そして相互の励ましの王を頼りとすることができます。
決して早い、決して遅