diff --git a/3sum/hwi-middle.cpp b/3sum/hwi-middle.cpp new file mode 100644 index 0000000000..c77a7db04a --- /dev/null +++ b/3sum/hwi-middle.cpp @@ -0,0 +1,41 @@ +class Solution { +public: + vector> threeSum(vector& nums) { + vector> res; + + sort(nums.begin(), nums.end()); + + for (int i = 0; i < nums.size() && nums[i] <= 0; ++i) + { + if (i != 0 && nums[i - 1] == nums[i]) + { + continue; + } + + int l = i + 1; + int r = nums.size() - 1; + while (l < r) + { + int sum = nums[i] + nums[l] + nums[r]; + if (sum < 0) + { + ++l; + } + else if (sum > 0) + { + --r; + } + else + { + res.push_back({nums[i], nums[l++], nums[r--]}); + while (l < r && nums[l] == nums[l - 1]) + { + ++l; + } + } + } + } + + return res; + } +}; diff --git a/climbing-stairs/hwi-middle.cpp b/climbing-stairs/hwi-middle.cpp new file mode 100644 index 0000000000..e33c45456c --- /dev/null +++ b/climbing-stairs/hwi-middle.cpp @@ -0,0 +1,16 @@ +class Solution { +public: + int climbStairs(int n) { + int p = 1; + int pp = 0; + int cur = 0; + for (int i = 0; i < n; ++i) + { + cur = p + pp; + pp = p; + p = cur; + } + + return cur; + } +}; diff --git a/product-of-array-except-self/hwi-middle.cpp b/product-of-array-except-self/hwi-middle.cpp new file mode 100644 index 0000000000..0b2fb4a470 --- /dev/null +++ b/product-of-array-except-self/hwi-middle.cpp @@ -0,0 +1,22 @@ +class Solution { +public: + vector productExceptSelf(vector& nums) { + int n = nums.size(); + vector ans(n); + + ans[0] = 1; + for (int i = 1; i < n; i++) + { + ans[i] = ans[i-1] * nums[i-1]; + } + + int suffix = 1; + for (int i = n-1; i >= 0; i--) + { + ans[i] *= suffix; + suffix *= nums[i]; + } + + return ans; + } +}; diff --git a/valid-anagram/hwi-middle.cpp b/valid-anagram/hwi-middle.cpp new file mode 100644 index 0000000000..9c4f9be518 --- /dev/null +++ b/valid-anagram/hwi-middle.cpp @@ -0,0 +1,29 @@ +class Solution { +public: + bool isAnagram(string s, string t) { + if (s.size() != t.size()) + { + return false; + } + + int cnt_s[26]; + int cnt_t[26]; + + int len = s.size(); + for (int i = 0; i < len; ++i) + { + cnt_s[s[i] - 'a']++; + cnt_t[t[i] - 'a']++; + } + + for (int i = 0; i < 26; ++i) + { + if(cnt_s[i] != cnt_t[i]) + { + return false; + } + } + + return true; + } +}; diff --git a/validate-binary-search-tree/hwi-middle.cpp b/validate-binary-search-tree/hwi-middle.cpp new file mode 100644 index 0000000000..eaaeda8f36 --- /dev/null +++ b/validate-binary-search-tree/hwi-middle.cpp @@ -0,0 +1,46 @@ +/** + * Definition for a binary tree node. + * struct TreeNode { + * int val; + * TreeNode *left; + * TreeNode *right; + * TreeNode() : val(0), left(nullptr), right(nullptr) {} + * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} + * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} + * }; + */ +class Solution { +public: + bool isValidBST(TreeNode* root) { + vector v; + v.reserve(1e4); + + solve(root, v); + + int len = v.size(); + for (int i = 0; i < len - 1; ++i) + { + if (v[i] >= v[i + 1]) + { + return false; + } + } + + return true; + } + + void solve(TreeNode* root, vector& v) + { + if (root->left != nullptr) + { + solve(root->left, v); + } + + v.push_back(root->val); + + if (root->right != nullptr) + { + solve(root->right, v); + } + } +};