// First missing positive class Solution { public: int firstMissingPositive(vector& nums) { if (nums.empty()) { return 1; } int low = 0, high = nums.size() - 1; while (low < high) { while (low < high && nums[low] > 0) low++; while (low < high && nums[high] <= 0) high--; if (low < high) swap(nums, low, high); } int endOfPositives = nums[low] > 0 ? low : low - 1; int start = 0; for (int i = 0; i <= endOfPositives; i++) { if (nums[i] > endOfPositives + 1) { continue; } int idxToNegate = nums[i]; if (idxToNegate < 0) { idxToNegate *= -1; } if (nums[idxToNegate - 1] > 0) { nums[idxToNegate - 1] *= -1; } } for (int i = 0; i <= endOfPositives; i++) { if (nums[i] > 0) { return i + 1; } } return endOfPositives + 2; } private: void swap(vector &nums, int i, int j) { int k = nums[i]; nums[i] = nums[j]; nums[j] = k; } }; // Group anagrams class Solution { public: vector> groupAnagrams(vector& strs) { vector> result; unordered_map> um; for (string str: strs) { string sortedString = str; sort(sortedString.begin(), sortedString.end()); um[sortedString].push_back(str); } for (auto e: um) { result.push_back(e.second); } return result; } }; // Find duplicate with constant space and time complexity. class Solution { public: // [1, 2, 3, 4, 5, 4] int findDuplicate(vector& nums) { // Fast and Slow pointers: if (nums.empty() || nums.size() == 1) { return -1; } int slowIdx = nums[0], fastIdx = nums[0]; do { slowIdx = nums[slowIdx]; fastIdx = nums[nums[fastIdx]]; } while (slowIdx != fastIdx); slowIdx = nums[0]; while (slowIdx != fastIdx) { slowIdx = nums[slowIdx]; fastIdx = nums[fastIdx]; } return slowIdx; } }; // Add two numbers /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { ListNode *head = new ListNode(0); ListNode *prevNode = nullptr; int carry = 0; while (l1 != nullptr || l2 != nullptr || carry != 0) { int sum = carry; if (l1 != nullptr) { sum += l1->val; l1 = l1->next; } if (l2 != nullptr) { sum += l2->val; l2 = l2->next; } if (prevNode == nullptr) { head->val = sum % 10; prevNode = head; } else { prevNode->next = new ListNode(sum % 10); prevNode = prevNode->next; } carry = sum / 10; } return head; } }; // Merge intervals - sort by startTime class Solution { public: vector> merge(vector>& intervals) { vector> result; sort(intervals.begin( ), intervals.end( ), []( const auto& lhs, const auto& rhs) { return lhs[0] < rhs[0]; }); vector curInterval = intervals[0]; for (int i = 1; i < intervals.size(); i++) { if (curInterval[1] >= intervals[i][0]) { curInterval[1] = max(curInterval[1], intervals[i][1]); curInterval[0] = min(curInterval[0], intervals[i][0]); } else { result.push_back(curInterval); curInterval = intervals[i]; } } result.push_back(curInterval); return result; } }; // Max sub array class Solution { public: int maxSubArray(vector& nums) { if (nums.empty()) { return 0; } int sum = 0, maxSum = numeric_limits::min(); for (int i = 0; i < nums.size(); i++) { sum += nums[i]; if (sum > maxSum) { maxSum = sum; } if (sum < 0) { sum = 0; } } return maxSum; } }; // Insert Delete GetRandom in O(1) time class RandomizedSet { public: RandomizedSet() { } bool insert(int val) { if (m.find(val) != m.end()) return false; nums.emplace_back(val); m[val] = nums.size() - 1; return true; } bool remove(int val) { if (m.find(val) == m.end()) return false; int last = nums.back(); m[last] = m[val]; nums[m[val]] = last; nums.pop_back(); m.erase(val); return true; } int getRandom() { return nums[rand() % nums.size()]; } private: vector nums; unordered_map m; };