diff --git a/78/78.md b/78/78.md new file mode 100644 index 0000000..287b948 --- /dev/null +++ b/78/78.md @@ -0,0 +1,92 @@ +## 何も見ずに解いてみる + +```cpp +class Solution { +public: + vector> subsets(vector& nums) { + vector> result; + for (int subset = 0; subset < 1 << nums.size(); ++subset) { + vector subset_in_vector; + for (int element = 0; element < nums.size(); ++element) { + if (subset & (1 << element)) { + subset_in_vector.emplace_back(nums[element]); + } + } + result.emplace_back(subset_in_vector); + } + return result; + } +}; +``` + +## 他の人のコードを見てみる + +https://github.com/tokuhirat/LeetCode/pull/51/files +https://github.com/ryosuketc/leetcode_arai60/pull/40 +https://github.com/fhiyo/leetcode/pull/51/files +https://github.com/Ryotaro25/leetcode_first60/pull/55/files + +いろいろなやり方がありますね。 +変数名のつけ方が難しいです。 + +今まで作ったsubsetsを広げていくやり方で書いてみたらこんな感じになりました。 + +```cpp +class Solution { +public: + vector> subsets(vector& nums) { + vector> made_subsets = {{}}; + for (int num : nums) { + int current_size = made_subsets.size(); + for (int i = 0; i < current_size; ++i) { + vector subset = made_subsets[i]; + subset.emplace_back(num); + made_subsets.emplace_back(subset); + } + } + return made_subsets; + } +}; +``` + +そういえば最近気づいたんですがleetcodeの実行環境だと日本語の変数名も使えるみたいですね。 +下のコードどうでしょうか笑 + +```cpp +class Solution { +public: + vector> subsets(vector& 要素たち) { + vector> 今まで作った部分集合 = {{}}; + for (int 要素 : 要素たち) { + int 現時点のサイズ = 今まで作った部分集合.size(); + for (int インデックス = 0; インデックス < 現時点のサイズ; ++インデックス) { + vector 部分集合 = 今まで作った部分集合[インデックス]; + 部分集合.emplace_back(要素); + 今まで作った部分集合.emplace_back(部分集合); + } + } + return 今まで作った部分集合; + } +}; +``` + +## 最終コード + +```cpp +class Solution { +public: + vector> subsets(vector& nums) { + vector> result; + for (int bits = 0; bits < 1 << nums.size(); ++bits) { + vector subset; + for (int bit = 0; bit < nums.size(); ++bit) { + if (bits & (1 << bit)) { + subset.emplace_back(nums[bit]); + } + } + result.emplace_back(subset); + } + return result; + } +}; +```