From 9c80068466e83724dc9004bca374e26f2b130b95 Mon Sep 17 00:00:00 2001 From: Ryotaro Kurita Date: Tue, 11 Jun 2024 01:18:13 +0900 Subject: [PATCH 1/6] finish --- 1.Two Sum/loop.cpp | 17 +++++++++++++++++ 1.Two Sum/memo.md | 43 +++++++++++++++++++++++++++++++++++++++++++ 1.Two Sum/step1.cpp | 16 ++++++++++++++++ 1.Two Sum/step2.cpp | 15 +++++++++++++++ 1.Two Sum/step3.cpp | 14 ++++++++++++++ 5 files changed, 105 insertions(+) create mode 100644 1.Two Sum/loop.cpp create mode 100644 1.Two Sum/memo.md create mode 100644 1.Two Sum/step1.cpp create mode 100644 1.Two Sum/step2.cpp create mode 100644 1.Two Sum/step3.cpp diff --git a/1.Two Sum/loop.cpp b/1.Two Sum/loop.cpp new file mode 100644 index 0000000..b7561ca --- /dev/null +++ b/1.Two Sum/loop.cpp @@ -0,0 +1,17 @@ +class Solution { +public: + vector twoSum(vector& numbers, int target) { + + vector two_indices; + for (int i = 0; i < numbers.size(); i++) { + for (int j = 0; j < numbers.size(); j++) { + if (i != j && target - numbers[i] - numbers[j] == 0) { + two_indices.push_back(i); + two_indices.push_back(j); + return two_indices; + } + } + } + return two_indices; + } +}; diff --git a/1.Two Sum/memo.md b/1.Two Sum/memo.md new file mode 100644 index 0000000..dfda497 --- /dev/null +++ b/1.Two Sum/memo.md @@ -0,0 +1,43 @@ +## ステップ1 +forを2重で回せば解けたけどO(n^2)となってしまう +どうすれば計算量を抑えられるのかが今回の問題だと思う。 +時間 +O(n^2) +空間 +O(n^2) + +問題のジャンルがhash mapなのでmapを使った解法を考える +<数値、インデックス>でmapを作りこれをループで回して +targetから数値を引いた数をもつindexを探せばO(1)ですみそう + +Keyが重複する場合の回答の見つけ方が分からなかったので回答を参照 +https://leetcode.com/problems/two-sum/ +ループの最後に挿入することで +重複を上書きする前に、keyとvalueを見つけることができる +時間 +O(n) +空間 +O(n) + +## ステップ2 +・解なしの場合も考慮する、今回だと{}をreturnすることで差別化 +https://github.com/colorbox/leetcode/pull/3#discussion_r1519068995 +https://github.com/cheeseNA/leetcode/pull/1 + +・命名について +numsとnumbersどちらも存在しているのは気持ち悪いような気がするのでどちらかに統一 +https://github.com/sakupan102/arai60-practice/pull/12 + +・算術演算子についてもスタイルガイドが存在する +https://github.com/fhiyo/leetcode/pull/14 + +## 他の解法 +2重ループの回答はloop.cppに実装 + +## Discordなど +私は紙と鉛筆でやるんだったら、カードをソートして、頭と尻から辿っていくと思いますね。 +はじめに、一番初めと一番最後に着目します。 +着目しているものを足します。 +目標よりも小さかったら、前の方の着目しているのを一つ後ろにずらします。 +目標よりも大きかったら、後ろの方の着目しているのを一つ前にずらします。 +https://discord.com/channels/1084280443945353267/1183683738635346001/1187326805015810089 diff --git a/1.Two Sum/step1.cpp b/1.Two Sum/step1.cpp new file mode 100644 index 0000000..6df5474 --- /dev/null +++ b/1.Two Sum/step1.cpp @@ -0,0 +1,16 @@ +class Solution { +public: + vector twoSum(vector& nums, int target) { + map numbers_and_index; + vector two_indices; + for (int i = 0; i < nums.size(); i++) { + int remaining = target - nums[i]; + if (numbers_and_index.contains(remaining)) { + return {numbers_and_index[remaining], i}; + } + numbers_and_index.insert({nums[i], i}); + } + + return two_indices; + } +}; diff --git a/1.Two Sum/step2.cpp b/1.Two Sum/step2.cpp new file mode 100644 index 0000000..e219ace --- /dev/null +++ b/1.Two Sum/step2.cpp @@ -0,0 +1,15 @@ +class Solution { +public: + vector twoSum(vector& numbers, int target) { + map numbers_to_index; + for (int i = 0; i < numbers.size(); i++) { + int remaining = target - numbers[i]; + if (numbers_to_index.contains(remaining)) { + return {numbers_to_index[remaining], i}; + } + numbers_to_index.insert({numbers[i], i}); + } + + return {}; + } +}; diff --git a/1.Two Sum/step3.cpp b/1.Two Sum/step3.cpp new file mode 100644 index 0000000..746fd8c --- /dev/null +++ b/1.Two Sum/step3.cpp @@ -0,0 +1,14 @@ +class Solution { +public: + vector twoSum(vector& numbers, int target) { + map numbers_to_index; + for (int i = 0; i < numbers.size(); i++) { + int remaining = target - numbers[i]; + if (numbers_to_index.contains(remaining)) { + return {numbers_to_index[remaining], i}; + } + numbers_to_index[numbers[i]] = i; + } + return {}; + } +}; \ No newline at end of file From 0032241761d1030aca8fe30b5a04564c9128d555 Mon Sep 17 00:00:00 2001 From: Ryotaro Kurita Date: Thu, 13 Jun 2024 00:14:38 +0900 Subject: [PATCH 2/6] finish step4 --- 1.Two Sum/step4.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 1.Two Sum/step4.cpp diff --git a/1.Two Sum/step4.cpp b/1.Two Sum/step4.cpp new file mode 100644 index 0000000..a7ade29 --- /dev/null +++ b/1.Two Sum/step4.cpp @@ -0,0 +1,21 @@ +class Solution { +public: + vector twoSum(vector& numbers, int target) { + // 100mおきの数字のインデックスを記録しつつtargetを超える大きさなのか、 + // target以下なのかの情報とtargetまであと何の数字が必要か書いて渡すと思います。 + map numbers_to_index; + for (int i = 0; i < numbers.size(); i++) { + int remaining = target - numbers[i]; + numbers_to_index[remaining] = i; + } + + for (int i = 0; i < numbers.size(); i++) { + int target_remaining = numbers[i]; + if (numbers_to_index.contains(target_remaining) && numbers_to_index[target_remaining] != i) { + return {numbers_to_index[target_remaining], i}; + } + } + return {}; + } +}; + From 81f96a76a3a3cab8de6b7e315426566cdba79b6c Mon Sep 17 00:00:00 2001 From: Ryotaro Kurita Date: Thu, 13 Jun 2024 00:18:17 +0900 Subject: [PATCH 3/6] reflecting review --- 1.Two Sum/loop2.cpp | 17 +++++++++++++++++ 1.Two Sum/memo.md | 2 +- 1.Two Sum/step5.cpp | 14 ++++++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 1.Two Sum/loop2.cpp create mode 100644 1.Two Sum/step5.cpp diff --git a/1.Two Sum/loop2.cpp b/1.Two Sum/loop2.cpp new file mode 100644 index 0000000..2be56f7 --- /dev/null +++ b/1.Two Sum/loop2.cpp @@ -0,0 +1,17 @@ +class Solution { +public: + vector twoSum(vector& numbers, int target) { + + vector two_indices; + for (int i = 0; i < numbers.size(); i++) { + for (int j = i + 1; j < numbers.size(); j++) { + if (target - numbers[i] - numbers[j] == 0) { + two_indices.push_back(i); + two_indices.push_back(j); + return two_indices; + } + } + } + return two_indices; + } +}; diff --git a/1.Two Sum/memo.md b/1.Two Sum/memo.md index dfda497..737ef67 100644 --- a/1.Two Sum/memo.md +++ b/1.Two Sum/memo.md @@ -4,7 +4,7 @@ forを2重で回せば解けたけどO(n^2)となってしまう 時間 O(n^2) 空間 -O(n^2) +O(1) 問題のジャンルがhash mapなのでmapを使った解法を考える <数値、インデックス>でmapを作りこれをループで回して diff --git a/1.Two Sum/step5.cpp b/1.Two Sum/step5.cpp new file mode 100644 index 0000000..8300815 --- /dev/null +++ b/1.Two Sum/step5.cpp @@ -0,0 +1,14 @@ +class Solution { +public: + vector twoSum(vector& numbers, int target) { + map num_to_index; + for (int i = 0; i < numbers.size(); i++) { + int remaining = target - numbers[i]; + if (num_to_index.contains(remaining)) { + return {num_to_index[remaining], i}; + } + num_to_index[numbers[i]] = i; + } + return {}; + } +}; \ No newline at end of file From 16370ca991e736a5b0c58441f4c26e8446e543f7 Mon Sep 17 00:00:00 2001 From: Ryotaro Kurita Date: Fri, 14 Jun 2024 09:52:51 +0900 Subject: [PATCH 4/6] modified complexity --- 1.Two Sum/memo.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/1.Two Sum/memo.md b/1.Two Sum/memo.md index 737ef67..e49a765 100644 --- a/1.Two Sum/memo.md +++ b/1.Two Sum/memo.md @@ -6,7 +6,9 @@ O(n^2) 空間 O(1) -問題のジャンルがhash mapなのでmapを使った解法を考える +~~問題のジャンルがhash mapなのでmapを使った解法を考える~~ +liquo-riceさんから指摘があったようにMapは平衡二分探索木、unordered_mapがhash map + <数値、インデックス>でmapを作りこれをループで回して targetから数値を引いた数をもつindexを探せばO(1)ですみそう @@ -14,11 +16,15 @@ Keyが重複する場合の回答の見つけ方が分からなかったので https://leetcode.com/problems/two-sum/ ループの最後に挿入することで 重複を上書きする前に、keyとvalueを見つけることができる -時間 -O(n) +~~時間~~ +~~O(n)~~ 空間 O(n) +時間 +mapのcontainsを使う場合(log n)なので合計O(n log n) +unordered_mapのcontainsを使う場合はO(n)なのでO(n^2) +https://en.cppreference.com/w/cpp/container/unordered_map/contains ## ステップ2 ・解なしの場合も考慮する、今回だと{}をreturnすることで差別化 https://github.com/colorbox/leetcode/pull/3#discussion_r1519068995 From 3bd35d9da3e6b703ae38f98e9f01d6c0cee2db53 Mon Sep 17 00:00:00 2001 From: Ryotaro Kurita Date: Fri, 14 Jun 2024 22:51:44 +0900 Subject: [PATCH 5/6] modified reflecting review --- 1.Two Sum/loop3.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 1.Two Sum/loop3.cpp diff --git a/1.Two Sum/loop3.cpp b/1.Two Sum/loop3.cpp new file mode 100644 index 0000000..2c25d4c --- /dev/null +++ b/1.Two Sum/loop3.cpp @@ -0,0 +1,14 @@ +class Solution { +public: + vector twoSum(vector& numbers, int target) { + + for (int i = 0; i < numbers.size() - 1; i++) { + for (int j = i + 1; j < numbers.size(); j++) { + if (numbers[i] + numbers[j] == target) { + return {i, j}; + } + } + } + return {}; + } +}; From 837ff6b7f8f141da7b574fccc322af5fde40ee15 Mon Sep 17 00:00:00 2001 From: Ryotaro Kurita Date: Tue, 27 May 2025 08:32:50 +0900 Subject: [PATCH 6/6] added step6 --- 1.Two Sum/step6.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 1.Two Sum/step6.cpp diff --git a/1.Two Sum/step6.cpp b/1.Two Sum/step6.cpp new file mode 100644 index 0000000..056dcff --- /dev/null +++ b/1.Two Sum/step6.cpp @@ -0,0 +1,18 @@ +class Solution { +public: + vector twoSum(vector& nums, int target) { + if (nums.empty()) { + return {}; + } + + map num_to_index; + for (int i = 0; i < nums.size(); i++) { + int remain = target - nums[i]; + if (num_to_index.contains(remain)) { + return {num_to_index[remain], i}; + } + num_to_index[nums[i]] = i; + } + return {}; + } +};