From aabf777975309c8a7d8cc472600515936d698f67 Mon Sep 17 00:00:00 2001 From: "YUUUUYA(yuuchiya)(YUTA-Uchi)" <42081576+YUTA-Uchi@users.noreply.github.com> Date: Fri, 13 Dec 2024 23:27:30 +0900 Subject: [PATCH 1/4] add step1 --- 1.Two_sum.md | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 1.Two_sum.md diff --git a/1.Two_sum.md b/1.Two_sum.md new file mode 100644 index 0000000..19e729c --- /dev/null +++ b/1.Two_sum.md @@ -0,0 +1,72 @@ +URL:https://leetcode.com/problems/two-sum/ + +# Step1 + +- 使用言語:c言語(近いうちにC++にする予定ですが、一旦比較的慣れているCにしました) +- コードのNote、関数のプロトタイプは問題そのまま。引数名だけ統一のため変更しています(スネークケースへ) +- 所要時間:骨格部分は2~5分(しかしreturn_sizeの使用意図などに悩んで調べたりしたため最終的にはもっと多くかかっている) + +```C +/** + * Note: The returned array must be malloced, assume caller calls free(). + */ +int* twoSum(int* nums, int nums_size, int target, int* return_size) +{ + int i; + int j; + int *indice_of_sum; + + for (i = 0; i < nums_size; i++) + { + for (j = i + 1; j < nums_size; j++) + { + if (target - nums[i] == nums[j]) + { + *return_size = 2; + indice_of_sum = (int*)malloc(sizeof(int) * (*return_size)); + if (!indice_of_sum) + { + *return_size = 0; + return (NULL); + } + indice_of_sum[0] = i; + indice_of_sum[1] = j; + return (indice_of_sum); + } + } + } + *return_size = 0; + return (NULL); +} +``` + +## 思考過程 +- 問題だけ読んだ時は、愚直な解答(上記解答)はすぐ書けると考えました。 +- 問題文から31>log2(10^9)/log2(10)(約29)なのでintで問題なさそうと考えました。31という数字の根拠はintは基本的に32bitであり、先頭1bitは符号に使われるため2^31でOKだろうという判断です。 +- ただし、条件判定の際にオーバーフローしないようにしなければならないと考えました。(line23のif文はオーバーフロー対策の意図です) +- Follow-upに書かれているO(n^2)より少ない時間計算量という要件のアルゴリズムは浮かびませんでした。 +- その後家に帰宅後実際に実装しようとして、初めてC言語の場合のプロトタイプを確認。引数のreturn_sizeの使用意図がわからず、そこだけ他の方のSolutionsを確認してAcceptedまでもっていきました。 + - コーディング面接などであれば意図を確認してもいいだろうと思います。つまり、どのような呼び出され方を想定しており、return_sizeの使用はどのようにされるか、などです。どのような意図だと想定できるかと聞かれるかもなので、以下のような使用を想定しました。(ただし、自分が呼び出しも含め設計する場合、エラーチェックをしたいので後者のようになり、あまりreturn_sizeに意味が見いだせなくなります。) + ```C + result = twoSum(nums, nums_size, target, &return_size); + i = 0; + while (i < return_size) + //なんらかの処理 + ``` + ```C + result = twoSum(nums, nums_size, target, &return_size); + if (result) + i = 0; + while (i < return_size) + //なんらかの処理 + else + //エラー処理 + ``` + - 他の方の実装をみると、実際そこに迷っている人もちらほらいました。そして、結局確定的な意図はわからないものの、[mediumの記事](https://medium.com/@AlexanderObregon/solving-the-two-sum-problem-on-leetcode-c-answers-walkthrough-715066492a7a)で正解が見つからなかったときなどに*return_sizeに0を代入している実装を見て、上記のような想定に合致すると感じました(URL先の方はmalloc失敗の場合はエラーハンドリングしていないですが) +- ここまで考えた後、最悪のケースの足し算でも10^9 + 10^9か-10^9 + -10^9なのでオーバーフローの心配はないことに気づきました。そのためline23のif文は元の意図がわかりやすく +```C +if (nums[i] + nums[j] == target) +``` +でよいと考えました。 + + From 9574431fcc955325e3dc4fcd8d35284f2ce35055 Mon Sep 17 00:00:00 2001 From: "YUUUUYA(yuuchiya)(YUTA-Uchi)" <42081576+YUTA-Uchi@users.noreply.github.com> Date: Thu, 19 Dec 2024 13:14:28 +0900 Subject: [PATCH 2/4] step2 on the way --- 1.Two_sum.md | 43 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/1.Two_sum.md b/1.Two_sum.md index 19e729c..e12c211 100644 --- a/1.Two_sum.md +++ b/1.Two_sum.md @@ -2,9 +2,9 @@ URL:https://leetcode.com/problems/two-sum/ # Step1 -- 使用言語:c言語(近いうちにC++にする予定ですが、一旦比較的慣れているCにしました) +- 使用言語:c言語(近いうちにC++にする予定ですが、一旦比較的慣れているCにしました) - コードのNote、関数のプロトタイプは問題そのまま。引数名だけ統一のため変更しています(スネークケースへ) -- 所要時間:骨格部分は2~5分(しかしreturn_sizeの使用意図などに悩んで調べたりしたため最終的にはもっと多くかかっている) +- 所要時間:骨格部分は2~5分(しかしreturn_sizeの使用意図などに悩んで調べたりしたため最終的にはもっと多くかかっている) ```C /** @@ -69,4 +69,43 @@ if (nums[i] + nums[j] == target) ``` でよいと考えました。 +# step2 + +- ここで様々な方の実装を(c言語に限らず)参照しました。 +- https://github.com/t0hsumi/leetcode/pull/11 (辞書:python) +- https://github.com/katataku/leetcode/pull/10 (辞書:python) +- https://github.com/philip82148/leetcode-arai60/pull/1 (hashmap:c++) +- https://github.com/haniwachann/leetcode/pull/2 (map:c++) + - 平衡二分木、知らなかった(下記に調べた結果を書く) +- https://github.com/tarinaihitori/leetcode/pull/11 (愚直→辞書:python) +- https://github.com/rihib/leetcode/pull/8 (map:go) + - indexがキーで数字がvalueというよくあるパターンの逆なのでmapの変数名は分かりやすくしとかないとバグを誘いそう +- https://github.com/ryoooooory/LeetCode/pull/18 (HashMap:java) +- https://github.com/ryo-devz/LeetCode/pull/2 (辞書:python) +- https://github.com/hroc135/leetcode/pull/11 (map:go) +- https://github.com/seal-azarashi/leetcode/pull/11 (HashMap:java) + - 時間計算量と空間計算量 愚直な解答も空間計算量はすぐれている? +- https://github.com/aoshi2025s/leetcode-review/pull/1 (hashmap:c++) +- https://github.com/Yoshiki-Iwasa/Arai60/pull/10 (map:Rust) + - ここのコメントで引用されていたこの問題を手でやる場合、特に20人で分担している場合の話はなるほどと思った。 + - 現場作業的な話に落とし込むと、作業員みんながタブレットをもっていて、数字を確認するとまず調査済みの中に和がtargetになるものがあるか検索をかける。そして該当なしなら自分が確認した数字とその位置などを記載して調査済みクラウドに入れる。というのがmapと補数を使った解答のイメージですかね。 +- https://github.com/kazukiii/leetcode/pull/12 () +- https://github.com/Ryotaro25/leetcode_first60/pull/12 +- https://github.com/erutako/leetcode/pull/2 +- https://github.com/TORUS0818/leetcode/pull/13 +- https://github.com/fhiyo/leetcode/pull/14 +- https://github.com/nittoco/leetcode/commit/9be2925cc5133bd1f9c8c96cccb502a4c567f768#diff-61b61a407d462b1aaeb594ca2a3b7b9ef28eabb0efba555c0bc269412e1ad3acR35 +- https://github.com/nittoco/leetcode/blob/nittoco-patch-1/two_sum.md +- https://github.com/kzhra/Grind41/pull/1 +- https://github.com/mt4thbewithu/LeetCode/blob/main/1.%20Two%20Sum.py +- https://github.com/goto-untrapped/Arai60/pull/3 +- https://github.com/sakupan102/arai60-practice/pull/12 +- https://github.com/cheeseNA/leetcode/pull/1 +- https://github.com/colorbox/leetcode/pull/3 + +- indiceがindexの複数形だと勘違いしていました。[MicrosoftStyleGuide](https://learn.microsoft.com/ja-jp/style-guide/a-z-word-list-term-collections/i/index-indexes-indices)によると、通常はindexの複数形はindexes、数学的表現の場合のみindice,indicesを使用することとなっているため今回の件ではindexesが正しいことになります。 +- TwoSumという簡潔な関数名から、本流の処理を助けるだけの(かなり使用場所が限られた)ヘルパー関数であるか、もしくは簡潔であるからこそいろんな場面で使用される汎用関数であるかの可能性が高いと直感的には思いました。 + - おそらくほとんどの場合において、O(n^2)の愚直な実装で十分であると思います。懸念なのは時間計算量のみで、分かりやすさ(プログラミング初心者でもわかる)や手を入れる場合も把握がしやすいと思います。 + - どうしても処理時間の速さが求められ、この関数がO(n^2)であることがボトルネックになっている、と分かった段階でようやくさらに早いアルゴリズムに切り替えるのでも遅くないであろうと思います。 + - とはいえ、もし処理速度改善の担当にさせられたときにいくつか思い浮かんだ方がいいと思うので上記の他の方の実装を参考にいくつか実装してみたいと思います。 From f195b01288c94517f61b382b881c67abef24f0e4 Mon Sep 17 00:00:00 2001 From: "YUUUUYA(yuuchiya)(YUTA-Uchi)" <42081576+YUTA-Uchi@users.noreply.github.com> Date: Wed, 7 May 2025 23:24:42 +0900 Subject: [PATCH 3/4] step1_3 --- 1.Two_sum.md | 250 +++++++++++++++++++++++++++++++-------------------- 1 file changed, 153 insertions(+), 97 deletions(-) diff --git a/1.Two_sum.md b/1.Two_sum.md index e12c211..dbe5b3a 100644 --- a/1.Two_sum.md +++ b/1.Two_sum.md @@ -1,111 +1,167 @@ URL:https://leetcode.com/problems/two-sum/ +Arai 1 / 60問目 + # Step1 -- 使用言語:c言語(近いうちにC++にする予定ですが、一旦比較的慣れているCにしました) -- コードのNote、関数のプロトタイプは問題そのまま。引数名だけ統一のため変更しています(スネークケースへ) -- 所要時間:骨格部分は2~5分(しかしreturn_sizeの使用意図などに悩んで調べたりしたため最終的にはもっと多くかかっている) - -```C -/** - * Note: The returned array must be malloced, assume caller calls free(). - */ -int* twoSum(int* nums, int nums_size, int target, int* return_size) -{ - int i; - int j; - int *indice_of_sum; - - for (i = 0; i < nums_size; i++) - { - for (j = i + 1; j < nums_size; j++) - { - if (target - nums[i] == nums[j]) - { - *return_size = 2; - indice_of_sum = (int*)malloc(sizeof(int) * (*return_size)); - if (!indice_of_sum) - { - *return_size = 0; - return (NULL); +- 使用言語:c++(普段はC言語などが主なためほぼC++初心者です) +- 所要時間:骨格部分は2~5分(STLの使い方を調べるのにはもっとかかりました) + +no.1 +```c++ +#include + +class Solution { + public: + std::vector twoSum(std::vector& nums, int target) { + + for (int i = 0; i < nums.size(); i++) { + for (int j = i + 1; j < nums.size(); j++) { + if (nums[i] + nums[j] == target) { + return {i, j}; + } } - indice_of_sum[0] = i; - indice_of_sum[1] = j; - return (indice_of_sum); } + return {}; } - } - *return_size = 0; - return (NULL); -} +}; ``` +no.2 +```c++ +#include +#include -## 思考過程 -- 問題だけ読んだ時は、愚直な解答(上記解答)はすぐ書けると考えました。 -- 問題文から31>log2(10^9)/log2(10)(約29)なのでintで問題なさそうと考えました。31という数字の根拠はintは基本的に32bitであり、先頭1bitは符号に使われるため2^31でOKだろうという判断です。 -- ただし、条件判定の際にオーバーフローしないようにしなければならないと考えました。(line23のif文はオーバーフロー対策の意図です) -- Follow-upに書かれているO(n^2)より少ない時間計算量という要件のアルゴリズムは浮かびませんでした。 -- その後家に帰宅後実際に実装しようとして、初めてC言語の場合のプロトタイプを確認。引数のreturn_sizeの使用意図がわからず、そこだけ他の方のSolutionsを確認してAcceptedまでもっていきました。 - - コーディング面接などであれば意図を確認してもいいだろうと思います。つまり、どのような呼び出され方を想定しており、return_sizeの使用はどのようにされるか、などです。どのような意図だと想定できるかと聞かれるかもなので、以下のような使用を想定しました。(ただし、自分が呼び出しも含め設計する場合、エラーチェックをしたいので後者のようになり、あまりreturn_sizeに意味が見いだせなくなります。) - ```C - result = twoSum(nums, nums_size, target, &return_size); - i = 0; - while (i < return_size) - //なんらかの処理 - ``` - ```C - result = twoSum(nums, nums_size, target, &return_size); - if (result) - i = 0; - while (i < return_size) - //なんらかの処理 - else - //エラー処理 - ``` - - 他の方の実装をみると、実際そこに迷っている人もちらほらいました。そして、結局確定的な意図はわからないものの、[mediumの記事](https://medium.com/@AlexanderObregon/solving-the-two-sum-problem-on-leetcode-c-answers-walkthrough-715066492a7a)で正解が見つからなかったときなどに*return_sizeに0を代入している実装を見て、上記のような想定に合致すると感じました(URL先の方はmalloc失敗の場合はエラーハンドリングしていないですが) -- ここまで考えた後、最悪のケースの足し算でも10^9 + 10^9か-10^9 + -10^9なのでオーバーフローの心配はないことに気づきました。そのためline23のif文は元の意図がわかりやすく -```C -if (nums[i] + nums[j] == target) +class Solution { + public: + std::vector twoSum(std::vector& nums, int target) { + std::map map_to_complement_index; + + for (int i = 0; i < nums.size(); ++i) { + int complement = target - nums[i]; + + if (map_to_complement_index.find(complement) != map_to_complement_index.end()) { + return {map_to_complement_index[complement], i}; + } + + map_to_complement_index[nums[i]] = i; + } + + return {}; + } +}; ``` -でよいと考えました。 +no.3 +```c++ +#include +#include + +class Solution { + public: + std::vector twoSum(std::vector& nums, int target) { + std::set numSet; + + for (int i = 0; i < nums.size(); ++i) { + int complement = target - nums[i]; + + if (numSet.find(complement) != numSet.end()) { + int complementIndex = std::distance(nums.begin(), std::find(nums.begin(), nums.end(), complement)); + return {complementIndex, i}; + } + + numSet.insert(nums[i]); + } + + return {}; + } +}; +``` + + +## 思考過程 +- 問題だけ読んだ時は、愚直な解答(no.1)はすぐ書けると考えました。 + +- 何回かこの問題のレビューをみていたので、mapを使う方法もあると朧げながら覚えていた。unordered_map, mapなどの使い方をAIとリファレンスを言ったり来たりしてno.2は書きました。 +- 途中でmapの特徴などを見ていたら、set(集合)的なやつでも書けるのでは?と思いsetのリファレンスも見に行きました。 + →しかしsetは`set`であるため値を放り込んでおくことしかできないと気づく。そうなるとcomplementは見つけられてもそこからインデックスを抽出するのにそのcomplementを探す線形探索が必要になる。これはAIに書いてもらった(no.3) + +- ここら辺で問題を再整理。ほしいのは足すとtargetになるインデックスのペアなので、値をkey、インデックスをvalueにする形で調べた値は保管しておいて、ペアになる値があるか探すno.2はかなり自然に感じる。 +- setの回答は途中までいい感じで進めてるけど、いざペアが見つかった!となったあとにこの値って何番目だっけ?とインデックスを探しに行っている感じがちょっと素っ頓狂に見える。 + +- あとはこのtwoSum関数がどこまで使われて、かつ速さが求められるか、チームのメンバのC++の理解などでどの方式にするかは違うかも。特に自分はまだC++に慣れてないため、no.2が理解したら自然に感じられるとはいえど、no.1の方が理解しやすい。ただ、最近C言語で配列でのループをみる時も、2重ループ程度でもえーっとこのi,jは初期値が何でどうゆう条件でループするんだっけと意外とワーキングメモリ使っていて読むの大変だなと思うときがある。多分慣れるとno.2の方がわかりやすいんだろうなと思う。 # step2 -- ここで様々な方の実装を(c言語に限らず)参照しました。 -- https://github.com/t0hsumi/leetcode/pull/11 (辞書:python) -- https://github.com/katataku/leetcode/pull/10 (辞書:python) -- https://github.com/philip82148/leetcode-arai60/pull/1 (hashmap:c++) -- https://github.com/haniwachann/leetcode/pull/2 (map:c++) - - 平衡二分木、知らなかった(下記に調べた結果を書く) -- https://github.com/tarinaihitori/leetcode/pull/11 (愚直→辞書:python) -- https://github.com/rihib/leetcode/pull/8 (map:go) - - indexがキーで数字がvalueというよくあるパターンの逆なのでmapの変数名は分かりやすくしとかないとバグを誘いそう -- https://github.com/ryoooooory/LeetCode/pull/18 (HashMap:java) -- https://github.com/ryo-devz/LeetCode/pull/2 (辞書:python) -- https://github.com/hroc135/leetcode/pull/11 (map:go) -- https://github.com/seal-azarashi/leetcode/pull/11 (HashMap:java) - - 時間計算量と空間計算量 愚直な解答も空間計算量はすぐれている? -- https://github.com/aoshi2025s/leetcode-review/pull/1 (hashmap:c++) -- https://github.com/Yoshiki-Iwasa/Arai60/pull/10 (map:Rust) - - ここのコメントで引用されていたこの問題を手でやる場合、特に20人で分担している場合の話はなるほどと思った。 - - 現場作業的な話に落とし込むと、作業員みんながタブレットをもっていて、数字を確認するとまず調査済みの中に和がtargetになるものがあるか検索をかける。そして該当なしなら自分が確認した数字とその位置などを記載して調査済みクラウドに入れる。というのがmapと補数を使った解答のイメージですかね。 -- https://github.com/kazukiii/leetcode/pull/12 () -- https://github.com/Ryotaro25/leetcode_first60/pull/12 -- https://github.com/erutako/leetcode/pull/2 -- https://github.com/TORUS0818/leetcode/pull/13 -- https://github.com/fhiyo/leetcode/pull/14 -- https://github.com/nittoco/leetcode/commit/9be2925cc5133bd1f9c8c96cccb502a4c567f768#diff-61b61a407d462b1aaeb594ca2a3b7b9ef28eabb0efba555c0bc269412e1ad3acR35 -- https://github.com/nittoco/leetcode/blob/nittoco-patch-1/two_sum.md -- https://github.com/kzhra/Grind41/pull/1 -- https://github.com/mt4thbewithu/LeetCode/blob/main/1.%20Two%20Sum.py -- https://github.com/goto-untrapped/Arai60/pull/3 -- https://github.com/sakupan102/arai60-practice/pull/12 -- https://github.com/cheeseNA/leetcode/pull/1 -- https://github.com/colorbox/leetcode/pull/3 - -- indiceがindexの複数形だと勘違いしていました。[MicrosoftStyleGuide](https://learn.microsoft.com/ja-jp/style-guide/a-z-word-list-term-collections/i/index-indexes-indices)によると、通常はindexの複数形はindexes、数学的表現の場合のみindice,indicesを使用することとなっているため今回の件ではindexesが正しいことになります。 -- TwoSumという簡潔な関数名から、本流の処理を助けるだけの(かなり使用場所が限られた)ヘルパー関数であるか、もしくは簡潔であるからこそいろんな場面で使用される汎用関数であるかの可能性が高いと直感的には思いました。 - - おそらくほとんどの場合において、O(n^2)の愚直な実装で十分であると思います。懸念なのは時間計算量のみで、分かりやすさ(プログラミング初心者でもわかる)や手を入れる場合も把握がしやすいと思います。 - - どうしても処理時間の速さが求められ、この関数がO(n^2)であることがボトルネックになっている、と分かった段階でようやくさらに早いアルゴリズムに切り替えるのでも遅くないであろうと思います。 - - とはいえ、もし処理速度改善の担当にさせられたときにいくつか思い浮かんだ方がいいと思うので上記の他の方の実装を参考にいくつか実装してみたいと思います。 +https://github.com/Miyamoto-tryk/leetcode-arai60/pull/1/files +https://github.com/Shinkomori19/arai60/pull/2/files +https://github.com/azriel1rf/leetcode-prep/pull/3 +- 他の方の実装を読む。見つからなかったときにどういう風に返すのが自然か。実際Step1を実際に手元で確かめることをしてた時、これreturn {};が返されたときってどう検知しようかと一瞬迷ったので自然な返り値は大事。 +```c++ +std::vector result = solution.twoSum(nums, target); +if (result.size() != 2) { + std::cout << "No solution found." << std::endl; + return 1; +} +``` +- pythonなどだとNoneを返す手がある。AIに聞いたらC++17から使えるようになったstd::optionalを使うとちょっと返り値の部分をいじる必要はあるもののstd::nulloptというnullっぽい値を返すことができるようだ。これはC言語でNULLを返しがちな自分としては好み。 +- {-1, -1}というようにこの問題ではあり得ない値のペアを返す案も見かけたが、今後データがマイナスまで伸びるかもしれないとか考えると使いづらいと思いました。 +- exceptionをthrowするのは、ちょっとこの関数を使うためだけに呼び出し元でtry catch書かせるのは違うかなという感覚があります。 + + +- C++だとunordered_mapかmapかという話がよく出てくる。自分はリファレンスを調べたときにunordered_mapがハッシュテーブル、mapが赤黒木という実装だと読んだ。自分の中でハッシュテーブルは(たとえばmodをとる場合などに)同じリストに配属されてしまうみたいなことがなければ、かなり早いものの、データによっては(最悪の場合)線形探索と同等になってしまうイメージ。要求とデータが上手い具合に重なれば選択肢となりそう。 +- 一方で赤黒木はあまり詳しい実装方法は知らないが、平衡二分木の一つという話は知ってて、平衡二分木はきれいな二分木にするために毎回深さや層を調整するtreeだと理解していました。こちらのほうが平均的にそちらを選びました。 + +https://github.com/irohafternoon/LeetCode/pull/13/files +- map_to_complement_indexという変数名は、to_complement_indexの部分はなるべく分かりやすいようにしたつもりだったがmap型の変数にmapとつけるのは冗長だと反省。num_to_index, num_to_indexes, num_to_indicesなどが多い。indexを複数形にするかは悩みどころ。 +- 一般的に複数形の方が有標なので、複数形にしていると何か意図があるのかもと考えてしまうかも。今回のようにすぐに中身がわかる(スコープがそんなに広くない)変数であれば、まあどっちでもいいかもですがnum_to_indexesなどだと一瞬1対多なのかと思ったり。 + +```c++ +#include +#include + +class solution { + public: + std::vector twoSum(std::vector& nums, int target) { + std::map num_to_index; + + for (int i = 0; i < nums.size(); i++) { + int complement = target - nums[i]; + + if (num_to_index.find(complement) != num_to_index.end()) { + return {num_to_index[complement], i}; + } + + num_to_index[nums[i]] = i; + } + + return {}; + } +} +``` + +step3 +- 3回書くと流石にすらすらかけるようになった。 + +```c++ +#include +#include + +class solution { + public: + std:vector twoSum(std::vector& nums, int target) { + std::map num_to_index; + + for (int i = 0; i < nums.size(); i++) { + int complement = target - nums[i]; + + if (num_to_index.find(complement) != num_to_index.end()) { + return {num_to_index[complement], i}; + } + + num_to_index[nums[i]] = i; + } + + return {}; + } +} +``` From 1ac7e71a9dfaae10ca78de46deb66da235f6b902 Mon Sep 17 00:00:00 2001 From: "YUUUUTA (yuuchiya)" <42081576+YUTA-Uchi@users.noreply.github.com> Date: Thu, 8 May 2025 00:14:52 +0900 Subject: [PATCH 4/4] fix indent --- 1.Two_sum.md | 138 ++++++++++++++++++++++++--------------------------- 1 file changed, 65 insertions(+), 73 deletions(-) diff --git a/1.Two_sum.md b/1.Two_sum.md index dbe5b3a..b6215a0 100644 --- a/1.Two_sum.md +++ b/1.Two_sum.md @@ -12,18 +12,17 @@ no.1 #include class Solution { - public: - std::vector twoSum(std::vector& nums, int target) { - - for (int i = 0; i < nums.size(); i++) { - for (int j = i + 1; j < nums.size(); j++) { - if (nums[i] + nums[j] == target) { - return {i, j}; - } - } - } - return {}; - } + public: + std::vector twoSum(std::vector& nums, int target) { + for (int i = 0; i < nums.size(); i++) { + for (int j = i + 1; j < nums.size(); j++) { + if (nums[i] + nums[j] == target) { + return {i, j}; + } + } + } + return {}; + } }; ``` no.2 @@ -32,22 +31,20 @@ no.2 #include class Solution { - public: - std::vector twoSum(std::vector& nums, int target) { - std::map map_to_complement_index; - - for (int i = 0; i < nums.size(); ++i) { - int complement = target - nums[i]; - - if (map_to_complement_index.find(complement) != map_to_complement_index.end()) { - return {map_to_complement_index[complement], i}; - } - - map_to_complement_index[nums[i]] = i; - } - - return {}; - } + public: + std::vector twoSum(std::vector& nums, int target) { + std::map map_to_complement_index; + + for (int i = 0; i < nums.size(); ++i) { + int complement = target - nums[i]; + if (map_to_complement_index.find(complement) != map_to_complement_index.end()) { + return {map_to_complement_index[complement], i}; + } + map_to_complement_index[nums[i]] = i; + } + + return {}; + } }; ``` no.3 @@ -56,23 +53,21 @@ no.3 #include class Solution { - public: - std::vector twoSum(std::vector& nums, int target) { - std::set numSet; - - for (int i = 0; i < nums.size(); ++i) { - int complement = target - nums[i]; - - if (numSet.find(complement) != numSet.end()) { - int complementIndex = std::distance(nums.begin(), std::find(nums.begin(), nums.end(), complement)); - return {complementIndex, i}; - } - - numSet.insert(nums[i]); - } - - return {}; - } + public: + std::vector twoSum(std::vector& nums, int target) { + std::set numSet; + + for (int i = 0; i < nums.size(); ++i) { + int complement = target - nums[i]; + if (numSet.find(complement) != numSet.end()) { + int complementIndex = std::distance(nums.begin(), std::find(nums.begin(), nums.end(), complement)); + return {complementIndex, i}; + } + numSet.insert(nums[i]); + } + + return {}; + } }; ``` @@ -119,22 +114,20 @@ https://github.com/irohafternoon/LeetCode/pull/13/files #include class solution { - public: - std::vector twoSum(std::vector& nums, int target) { - std::map num_to_index; - - for (int i = 0; i < nums.size(); i++) { - int complement = target - nums[i]; - - if (num_to_index.find(complement) != num_to_index.end()) { - return {num_to_index[complement], i}; - } - - num_to_index[nums[i]] = i; - } + public: + std::vector twoSum(std::vector& nums, int target) { + std::map num_to_index; + + for (int i = 0; i < nums.size(); i++) { + int complement = target - nums[i]; + if (num_to_index.find(complement) != num_to_index.end()) { + return {num_to_index[complement], i}; + } + num_to_index[nums[i]] = i; + } - return {}; - } + return {}; + } } ``` @@ -146,22 +139,21 @@ step3 #include class solution { - public: - std:vector twoSum(std::vector& nums, int target) { - std::map num_to_index; - - for (int i = 0; i < nums.size(); i++) { - int complement = target - nums[i]; + public: + std:vector twoSum(std::vector& nums, int target) { + std::map num_to_index; - if (num_to_index.find(complement) != num_to_index.end()) { - return {num_to_index[complement], i}; - } + for (int i = 0; i < nums.size(); i++) { + int complement = target - nums[i]; - num_to_index[nums[i]] = i; - } + if (num_to_index.find(complement) != num_to_index.end()) { + return {num_to_index[complement], i}; + } + num_to_index[nums[i]] = i; + } - return {}; - } + return {}; + } } ```