序文
2019.10.26 初日のチェックイン
アルゴリズムは問題を解決する方法です。得られた結果は同じですが、異なるアルゴリズムを使用した同じ問題ですが、消費される時間とリソースは異なります。これには、アルゴリズムを学び、どのアルゴリズムがより優れているかを見つける必要があります。
アルゴリズムは主要企業へのインタビューに不可欠な要素であることは誰もが知っています。普通のプログラマーである私たちのほとんどは、仕事でアルゴリズムにあまり触れていません。将来、大規模な工場で仕事をして自分自身を向上させたい場合は、プログラミング能力を向上させるために、意図的な実践を通じてアルゴリズムとデータ構造を習得する必要があります。
「良い」アルゴリズムの基準
問題アルゴリズムの場合、それがアルゴリズムと呼ばれる理由、まず第一に、問題を解決できなければなりません(精度と呼ばれます)。第2に、このアルゴリズムで作成されたプログラムは、いかなる状況でもクラッシュしてはなりません(堅牢性と呼ばれます)。精度と堅牢性の両方が満たされている場合、次のステップは最も重要な点を検討することです。アルゴリズムによってプログラムがどの程度効率的に作成されているかです。
運用効率は2つの側面に反映されます。
- アルゴリズムの実行時間。(「時間の複雑さ」と呼ばれる)
- アルゴリズムの実行に必要なメモリ容量。(「スペースの複雑さ」と呼ばれます)
優れたアルゴリズムの標準は、アルゴリズム自体の要件を満たすことに基づいて、アルゴリズムによって記述されたプログラムは短時間実行され、操作中に必要なメモリ領域が少なくなります。このアルゴリズムは「優れたアルゴリズム」と呼ばれます。
トピック
毎日1枚のリートコード136。1度だけ出現する数値
カテゴリー:配列
タイトルリンク:https : //leetcode-cn.com/problems/single-number/
タイトル説明
空でない整数の配列を指定すると、各要素は1つの要素を除いて2回表示されます。一度だけ現れる要素を見つけます。
説明:
アルゴリズムには線形時間の複雑さが必要です。余分なスペースを使わずにこれを行うことができますか?
例1:
入力:[2,2,1]
出力:1
例2:
入力:[4,1,2,1,2]
出力:4
回答
自分でやれ
- アイデア
追加のHashMapを使用して各配列要素を格納し、最後に番号1の配列を取り出します(トピックを参照してください。本当に良いアイデアはありません。この方法は非常に非効率的である必要があります)
- コード
class Solution {
public int singleNumber(int[] nums) {
Map<Integer, Integer> temp = new HashMap<>();
for (int i : nums) {
temp.put(i, temp.get(i) == null ? 1 : temp.get(i) 1);
}
for (int i : nums) {
if (temp.get(i) == 1) {
return i;
}
}
return 0;
}
}
- 複雑さの分析
- 時間の複雑さ:O(nn)= O(n)。
for
ループの時間の複雑さはO(n)です。 - スペースの複雑さ:O(n)。hashmapに必要なスペースは、nums内の要素の数と同じです。
- の結果
最適なソリューション:ビット操作
- アイデア
- 任意の数と0 XOR自体:0 ^ n => n
- 同じ数のXORは0です:n ^ n => 0
- XOR(排他的OR)は可換および連想の法則を満たします:a ^ b ^ a =(a ^ a)^ b = 0 ^ b = b
したがって、一意の番号を取得するには、すべての番号をXORする必要があります。
- コード
class Solution {
public int singleNumber(int[] nums) {
int result = 0;
for(int i : nums) {
result^=i;
}
return result;
}
}
- 複雑さの分析
- 時間の複雑さ:O(n)。nums要素をトラバースする必要があるのは1回だけなので、時間の複雑さはnums内の要素の数になります。
- スペースの複雑さ:O(1)。
の結果
おわりに
私はあなたがそれを少なくとも2回行うことをお勧めします、あなたはいくつかの新しい技術や方法を見つけるかもしれません。練習中は、この質問への回答を故意に暗記することはありません。これは長期的な解決策ではありません。回答を参照して問題を自分で解決しないでください。これにより、思考力とプログラミング能力が向上します。
今日は出勤の初日です。今日の仕事と開発におけるアルゴリズムの重要性を理解していますが、この部分の知識を習得するには時間がかかります。初めてのチェックインだったせいか、今日は2時間もかかりました。
一緒に進歩したい友達、作者のパブリックアカウントに注意を払うことを歓迎します:コードの入力に恋をして、定期的にJavaテクノロジーの仕事を共有し、退屈なテクノロジーを泳ぎましょう!
[この記事はこのサイトで最初に公開されました。転載のソースを指定してください]: http : //coderluo.top