diff --git a/contains-duplicate/flynn.cpp b/contains-duplicate/flynn.cpp new file mode 100644 index 000000000..11404be57 --- /dev/null +++ b/contains-duplicate/flynn.cpp @@ -0,0 +1,24 @@ +/** + * for given size of input nums N, + * + * Time complexity: O(N) + * - iteration: O(N) + * - unorderd_set find method: O(1) on average + * - unorderd_set insert method: O(1) on average + * + * Space complexity: O(N) + */ + +class Solution { +public: + bool containsDuplicate(vector& nums) { + unordered_set unique_numbers; + + auto it = nums.begin(); + while (it != nums.end()) { + if (unique_numbers.find(*it) == unique_numbers.end()) unique_numbers.insert(*(it++)); + else return true; + } + return false; + } +}; diff --git a/kth-smallest-element-in-a-bst/flynn.cpp b/kth-smallest-element-in-a-bst/flynn.cpp new file mode 100644 index 000000000..10b4e7a3b --- /dev/null +++ b/kth-smallest-element-in-a-bst/flynn.cpp @@ -0,0 +1,41 @@ +/** + * For the height H of the given BST, + * + * Time complexity: O(max(H, K)) + * - if H > K, O(H) at worst + * - else, O(K) + * + * Space complexity: O(H > K ? H + K : K) + * - additional vector to save nums O(K) + * - if H > K, call stack O(H) + * - else, O(K) + */ + +/** + * 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: + void inorder(TreeNode* node, vector& v, int max_size) { + if (!node || v.size() == max_size) return; + + if (node->left) inorder(node->left, v, max_size); + v.push_back(node->val); + if (node->right) inorder(node->right, v, max_size); + } + + int kthSmallest(TreeNode* root, int k) { + vector nums; + inorder(root, nums, k); + + return nums[k - 1]; + } +}; diff --git a/number-of-1-bits/flynn.cpp b/number-of-1-bits/flynn.cpp new file mode 100644 index 000000000..ac095d247 --- /dev/null +++ b/number-of-1-bits/flynn.cpp @@ -0,0 +1,21 @@ +/** + * For given integer N, + * + * Time complexity: O(logN) + * + * Space complexity: O(1) + */ + +class Solution { +public: + int hammingWeight(int n) { + int res = 0; + + while (n) { + if (n & 1) res++; + n >>= 1; + } + + return res; + } +}; diff --git a/palindromic-substrings/flynn.cpp b/palindromic-substrings/flynn.cpp new file mode 100644 index 000000000..99ccfe48f --- /dev/null +++ b/palindromic-substrings/flynn.cpp @@ -0,0 +1,34 @@ +/** + * For the length N of given string s, + * + * Time complexity: O(N^3) + * + * Space complexity: O(1) + */ + +class Solution { +public: + int countSubstrings(string s) { + int res = 0; + + for (int i = 0; i < s.size(); i++) { + for (int j = i; j < s.size(); j++) { + int start = i, end = j; + bool is_palindrome = true; + + while (start <= end) { + if (s[start] != s[end]) { + is_palindrome = false; + break; + } + start++; + end--; + } + + if (is_palindrome) res++; + } + } + + return res; + } +}; diff --git a/top-k-frequent-elements/flynn.cpp b/top-k-frequent-elements/flynn.cpp new file mode 100644 index 000000000..26cc6b7c6 --- /dev/null +++ b/top-k-frequent-elements/flynn.cpp @@ -0,0 +1,46 @@ +/** + * For given size of nums N and K, + * + * Time complexity: O(N + MlogM + KlogM) <= O(NlogN) + * - the first iteration: O(N) + * - N times of + * - unordered_map find: O(1) on average + * - unordered_map insert: O(1) on average + * - the second iteration: O(MlogM) such that M is the number of unique numbers + * - M times of + * - priority_queue push: O(logM) + * - the last iteration of making result: O(KlogM) + * - K times of + * - priority_queue pop: O(logM) + * + * Space complexity: O(N) at worst + */ + +class Solution { +public: + vector topKFrequent(vector& nums, int k) { + vector res; + priority_queue> pq; + unordered_map m; + + auto nums_it = nums.begin(); + while (nums_it != nums.end()) { + if (m.find(*nums_it) == m.end()) m.insert({*nums_it, 1}); + else m[*nums_it]++; + nums_it++; + } + + auto m_it = m.begin(); + while (m_it != m.end()) { + pq.push({(*m_it).second, (*m_it).first}); + m_it++; + } + + while (k--) { + res.push_back(pq.top().second); + pq.pop(); + } + + return res; + } +};